738.单调递增的数字
思路:从后往前逐位判断相对前一位是否单调递增,如果不满足单调递增条件,就将前一位数值减一,并记录下当前数字的位置,随着for循环不断更新不满足单调递增条件的位置。
重点:
为什么从后往前遍历?根据给出的用例进行模拟,发现从前向后并不能保证结果正确,但是从后向前符合修改的逻辑,并且结果也是正确的。
为什么不满足条件前一位数值减一?题目要求的是不大于给定数值的最大单调递增数字,如果当前位数不满足单调递增,例如332,遍历到2,2不满足>=3,这个时候要求的数字的个位数必须小于2,并且保证递增要大于3,这明显是不可能的,对于332的后两位来说,这个数字一定不能超过30,于是便是29,即前一个位数减1,记录下当前数字(2)的位置。
为什么要记录下当前遍历数字的位置?这个位置代表这个位置与其之后的位置必须全部变成数字9。
为什么是后面的数字全部变成9?可以类比332的逻辑,如果是32000,那我肯定不能返回30000以上的结果,于是返回29999,所以可以看到后面的数字全部变成9了。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string result = to_string(n);
int flag = result.size();
for(int i = result.size() - 1; i > 0; i--){
if(result[i] < result[i - 1]){
result[i - 1]--;
flag = i;
}
}
for(int i = flag ; i < result.size(); i++){
result[i] = '9';
}
return stoi(result);
}
};
968.监控二叉树
这个题目的思路比较复杂,等二刷的时候再来琢磨这道题。下图指明了本题的思路。
/**
* 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:
int result = 0;
int minCameraCover(TreeNode* root) {
if(!traversal(root)){
result++;
}
return result;
}
int traversal(TreeNode* node){
if(node == nullptr)return 2;
int left = traversal(node->left);
int right = traversal(node->right);
if(left == 2 && right == 2)return 0;
if(left == 0 || right == 0){
result++;
return 1;
}
if(left == 1 || right == 1)return 2;
return -1;
}
};