二刷代码随想录训练营Day 31|56. 合并区间、738.单调递增的数字、968.监控二叉树、总结

1.合并区间

代码随想录 (programmercarl.com)

56. 合并区间 - 力扣(LeetCode)

 代码:

class Solution {
public:
    static bool cmp(const vector<int>& a,const vector<int>& b){
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        if(intervals.size() == 0) return result;
        sort(intervals.begin(),intervals.end(),cmp);
        result.push_back(intervals[0]);
        for(int i = 1; i < intervals.size(); i++){
            if(result.back()[1] >= intervals[i][0]){ // 重叠区间
                result.back()[1] = max(intervals[i][1],result.back()[1]);
            }else{
                result.push_back(intervals[i]);
            }
        }
        return result;
    }
};

note:这道题和之前的重叠区间的判断一样的逻辑。(都要先排序哦)

只不过我们这次直接用新数组里的最新元素去和当前遍历元素去比,如果两种重叠,就去更新数组内的元素的右边界为两者的最大值。

2.单调递增的数字

代码随想录 (programmercarl.com)

738. 单调递增的数字 - 力扣(LeetCode)

代码:

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string strNum = to_string(n);
        int flat = strNum.size();
        for(int i = strNum.size() - 1; i > 0; i--){
            if(strNum[i] < strNum[i - 1]){
                flat = i;
                strNum[i - 1]--;
            }
        }
        for(int i = flat; i < strNum.size(); i++){
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

 note:判断哪些位置为9,需要我们从后往前遍历!因为如果从前往后遍历,在遍历中修改值的时候会导致后面的元素又比前面元素小了,出现不满足单调递增的情况。

此外,int变string是to_string() string变int是stoi()

3.监控二叉树

代码随想录 (programmercarl.com)
968. 监控二叉树 - 力扣(LeetCode)

代码: 

/**
 * 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 {
    // 0 无覆盖 1 有摄像头 2 有覆盖
private:
    int result;
    int traversal(TreeNode* node){
        if(node == NULL) 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; // 函数不会走到这里的
    }
public:
    int minCameraCover(TreeNode* root) {
        result = 0;
        if(traversal(root) == 0){
            result++;
        }
        return result;
    }
};

note:注意遇到空结点返回已覆盖的状态,为了让叶子节点的parent节点成功安装摄像头。

以及在中间的逻辑判断的时候,点判断要安装摄像头的情况,再判断已覆盖的情况。因为这两者所用的条件判断是有子集的,如果左节点有摄像头,右节点没有,那么为了覆盖所有的节点,parent节点应该放摄像头而不是已覆盖的状态。

以及要单独对根结点进行判断,因为根结点没有父节点安装摄像头来处理了,所以如果根结点没有覆盖到,要单独安装。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值