贪心总结:没有固定套路,只有一条指导思想——局部最优可推得全局最优就是贪心。
注意:两个维度的时候,不要同时兼顾,选一个维度优化好,再优化另一个维度,在前一个维度的基础上调整就可以。
第一题、单调自增数字 力扣题目链接
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int flag = strNum.size();
for(int i = strNum.size() - 1; i > 0; i--){
if(strNum[i-1] > strNum[i]){
strNum[i-1]--;
flag = i;
}
}
for(int i = flag; i < strNum.size(); i++){
strNum[i] = '9';
}
return stoi(strNum);
}
};
第二题、监控二叉树 力扣题目链接
整体思路:用012三种状态表示各个节点的状态,然后由左右子节点判断其父节点的状态进行递归。
class Solution {
private:
int result;
int traversal(TreeNode* root){
if(root == NULL) return 2; // 空节点定义为有覆盖, 才能保证叶子节点的父节点装摄像头
int left = traversal(root->left);
int right = traversal(root->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;
}
public:
int minCameraCover(TreeNode* root) {
result = 0;
if(traversal(root) == 0){ // 第四种,如果最后根节点是无覆盖,需要装个摄像头
result++;
}
return result;
}
};