代码随想录算法训练营第三十天| 738.单调递增的数字 968.监控二叉树 (可以跳过)
738.单调递增的数字
要求:
保证最大的一个数,它满足 每个位数都是递增的
思路1:
为了减少时间复杂度,当时打算,先判断最大的位数,从大-》小,看以后的位数是否满足当前数比前一个数大
思路2:
其实前面再往后想想:就是如果当前的数不满足,直接降级,然后后面都是9 就可以了 ——》一定要好好看例子结果
代码:
1 // 要求:返回小于N 但是这个数字的每个位数都是单调递增的 2 // 3 // 难点:怎么判断他是单调递增? 4 // 1,每个数字转成字符串,然后进行比对 5 // 2,对每个数字都取余数123 : 先%10 得到3 然后/10 变成12 6 // 7 // 思路: 8 // 1,先从n往下遍历,如果满足这个条件,那么就可以 9 // 10 // 思路2: 11 // 1,先对目标节点遍历,获得它的数值,然后必须满足第一个数字是小于等于原数值,后面要求>=前一个 12 // 13 // 思路3; 14 // 1,如果当前节点不满足,那么就把比这个高的节点降级,然后此节点变成9 15 // 注意 100 -> 99 变成 一个标志 16 // 17 18 19 int monotoneIncreasingDigits(int n) { 20 if (n == 0) return 0; 21 22 string n_str = to_string(n); 23 int flag = 0; 24 for (int i = n_str.size() - 1; i >= 1; i--) 25 { 26 // 目的:直到找到最大的 n-1,9这样的情况,然后9后面的都变成9 27 if (n_str[i] < n_str[i - 1]) 28 { 29 n_str[i - 1] = n_str[i - 1] - 1; 30 flag = i; 31 } 32 } 33 34 for (int i = flag; i < n_str.size() && flag!=0; i++) 35 { 36 n_str[i] = '9'; 37 } 38 39 return stoi(n_str); 40 }
968.监控二叉树 (可以跳过)
难点:
虽然想到了后序遍历,叶子节点不能是摄像头,但是误判了用有左右孩子的是摄像头
而应该是:摄像头和摄像头中间要隔两个
代码(采用了状态的思路):
1 int minCameraCover_cursor(TreeNode* node, int& count) 2 { 3 if (!node) return 2; 4 5 int left = 2, right = 2; 6 7 if (node->left) left = minCameraCover_cursor(node->left, count); 8 if (node->right) right = minCameraCover_cursor(node->right, count); 9 10 if (left == 2 && right == 2) 11 { 12 return 0; 13 } 14 if (left == 0 || right == 0) 15 { 16 count++; 17 return 1; 18 } 19 if (left == 1 || right == 1) return 2; 20 21 return -1; 22 } 23 24 int minCameraCover(TreeNode* root) { 25 26 if (!root) return 0; 27 if (!root->left && !root->right) return 1; 28 int result = 0; 29 if (minCameraCover_cursor(root, result) == 0) 30 { 31 result++; 32 } 33 34 return result; 35 }