今天要和贪心算法说再见了。第一题是单调递增的数字https://leetcode.cn/problems/monotone-increasing-digits/,给出小于题目值的最大数,且该数的各位都要满足单调递增。从后向前遍历字符串,若不满足单调递增,则将前一位数字减一,同时将后续数字置为9。
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string str = to_string(n);
int flag = str.size();
for (int i = str.size() - 1; i > 0; i--){
if (str[i - 1] > str[i]){
str[i - 1]--;
flag = i;
}
}
for (int i = flag; i < str.size(); i++){
str[i] = '9';
}
return stoi(str);
}
};
最后一题是监控二叉树https://leetcode.cn/problems/binary-tree-cameras/description/,用最小的摄像头数量监控二叉树的所有节点。首先确定应在叶子结点的父节点放置摄像头,再每次隔两个结点向上遍历,用不同状态记录所有节点情况,知道所有节点均被覆盖。很复杂的一道题,直接看的卡哥思路了。
class Solution {
public:
int result;
int traversal(TreeNode* cur){
if (cur == NULL) 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;
}
if (left == 1 || right == 1) return 2;
return -1;
}
int minCameraCover(TreeNode* root) {
result = 0;
if (traversal(root) == 0) result++;
return result;
}
};
刷完贪心,确实感觉没什么规律可循,有的很简单,有的又很难,不过能认真刷完一遍还是要给自己竖一个大拇指哈哈