738.单调递增的数字
题目:力扣
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string num = to_string(n);
int flag = num.size();
for(int i = num.size() - 1; i > 0; --i){
if(num[i-1] > num[i]){
flag = i;
num[i - 1]--;
}
}
for(int i = flag; i < num.size(); ++i){
num[i] = '9';
}
return stoi(num);
}
};
714. 买卖股票的最佳时机含手续费
题目:力扣
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int result = 0;
int min_p = prices[0];
for(int i = 1; i < prices.size(); ++i){
if(prices[i] < min_p) min_p = prices[i];
if(prices[i] >= min_p && prices[i] <= min_p + fee){
continue;
}
if(prices[i] > min_p + fee){
result += prices[i] - min_p - fee;
min_p = prices[i] - fee;
}
}
return result;
}
};
968.监控二叉树
题目:力扣
class Solution {
private:
int result;
int traversal(TreeNode* cur) {
// 空节点,该节点有覆盖
if (cur == NULL) return 2;
int left = traversal(cur->left); // 左
int right = traversal(cur->right); // 右
// 情况1
// 左右节点都有覆盖
if (left == 2 && right == 2) return 0;
// 情况2
// left == 0 && right == 0 左右节点无覆盖
// left == 1 && right == 0 左节点有摄像头,右节点无覆盖
// left == 0 && right == 1 左节点有无覆盖,右节点摄像头
// left == 0 && right == 2 左节点无覆盖,右节点覆盖
// left == 2 && right == 0 左节点覆盖,右节点无覆盖
if (left == 0 || right == 0) {
result++;
return 1;
}
// 情况3
// left == 1 && right == 2 左节点有摄像头,右节点有覆盖
// left == 2 && right == 1 左节点有覆盖,右节点有摄像头
// left == 1 && right == 1 左右节点都有摄像头
// 其他情况前段代码均已覆盖
if (left == 1 || right == 1) return 2;
// 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解
// 这个 return -1 逻辑不会走到这里。
return -1;
}
public:
int minCameraCover(TreeNode* root) {
result = 0;
// 情况4
if (traversal(root) == 0) { // root 无覆盖
result++;
}
return result;
}
};
总结
题型:贪心