1.738單調遞增的數字
貪心策略:如果strNum[i]<strNum[i-1]那么strNum[i] = '9',strNum[i-1]--;//比如87對應的最大的單調遞增的就是79.
具體實現:
- 對于遇到小于的情況:如果strNum[i]<strNum[i-1]那么strNum[i] = '9',strNum[i-1]--;
- 遍歷順序必須得是一個反向遍歷,這樣才能保證找到最高位數需要進行改變的地方。(如果從左往右進行便利的話,會出現一種這樣的情況,例如N = 999998前面的都相等,那么需要改變的是最右側那個位置,明顯不符合,所以要從右往左進行遍歷)
- 使用flag來確定需要變成9的最左側的位置
class Solution {
public:int monotoneIncreasingDigits(int N) {string strNum = to_string(N);// flag用來標記賦值9從哪里開始// 設置為這個默認值,為了防止第二個for循環在flag沒有被賦值的情況下執行int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; i--) {if (strNum[i - 1] > strNum[i] ) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); i++) {strNum[i] = '9';}return stoi(strNum);}
};
2.968監控二叉樹
貪心策略:一個攝像頭能夠監控到更多的節點。
具體實現:
- 首先要確定的就是遍歷順序,是自頂向下還是自底向上的遍歷順序如果是自頂向下的話,那么就是判斷父節點是否被覆蓋,此時需要設置的節點就是:2,3,8,9,10,11,12,13,14,15.如果是自底向上的情況那么就是判斷左右孩子節點是否被覆蓋,此時需要設置的節點就是:4,5,6,7,1.所以確定的遍歷順序就是自底向上的情況。
- 再確定就是狀態:分為三種狀態:0:未被覆蓋,1:存放攝像頭,2:被覆蓋三種狀態。
- 對于空節點的處理:如果空節點的狀態為0,那么葉子結點就需要設置為存放攝像頭的,明顯是不符合的,當空節點的狀態為2的時候,此時葉子結點就不需要設置攝像頭了,只需要在葉子結點的上方設置攝像頭即可,所以空節點設置為2.
- 當前節點為2(被覆蓋):左右孩子中至少有一個是1(設置為節點),且左右孩子不能為0。
- 當前節點為1(設置攝像頭):左右孩子中至少有一個為0(未被覆蓋)。
- 當前節點為0(為被覆蓋):左右孩子全都是2(被覆蓋狀態)。
- 對于最后根節點的處理:因為會出現一種情況就是如果23全都是被覆蓋,那么設置的1就是為未覆蓋狀態(0)退出,但是不符合實際,此時需要將其變成設置攝像頭(2),所以最后還需要在主函數里面判斷返回值是否為0。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public://節點分三種情況://0:沒覆蓋;1:該節點存放攝像頭;2:該節點被覆蓋//當節點為空的時候設置為被覆蓋int result;int traversal(TreeNode* cur){if(cur == nullptr) return 2;int left = traversal(cur->left);int right = traversal(cur->right);//該節點為設置為沒覆蓋:左右節點都被覆蓋if(left == 2&&right == 2)return 0;//該節點設置為監控if(left == 0||right == 0){result++;return 1;}//該節點設置為被覆蓋//1.left =1,right =1;if(left == 1||right ==1){return 2;}return -1;//代表的知識一個完整性}int minCameraCover(TreeNode* root) {result = 0;if(traversal(root) == 0){//對于最后一個根節點的處理,如果此時設置為0,代表未被覆蓋,需要重新設置為1,即result++;result++;}return result;}
};