代码随想录算法训练营Day32 | 56. 合并区间 | 738.单调递增的数字 | 968.监控二叉树

今日任务

56. 合并区间

  • 题目链接: https://leetcode.cn/problems/merge-intervals/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        ranges::sort(intervals, [&](auto &a, auto &b)->bool{
            return a[0] < b[0];
        });
        int n = intervals.size();
        int start = intervals[0][0], end = intervals[0][1];
        vector<vector<int>> ans;
        for(int i = 1; i < n; i++){
            int a = intervals[i][0], b = intervals[i][1];
            if(a <= end){
                end = end < b ? b : end;
            }else{
                ans.push_back({start, end});
                start = a;
                end = b;
            }
        }
        ans.push_back({start, end});
        return ans;
    }
};

738.单调递增的数字

  • 题目链接: https://leetcode.cn/problems/monotone-increasing-digits/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        auto str = to_string(n);
        int sz = str.size();
        // char pre = str[0];
        // int same = 1;
        // for(int i = 1; i < sz; i++){
        //     int idx = i - same + 1;
        //     same = str[i] == pre ? same + 1 : 1;
        //     if(str[i] < pre){
        //         str[idx - 1] -= 1;
        //         return stoi(str.substr(0, idx) + string(sz - idx, '9'));
        //     }
        //     pre = str[i];
        // }

        int end = sz - 1;
        char back = str[end];
        for(int i = sz - 2; i >= 0; i--){
            if(str[i] > back){
                end = i;
            }
            back = str[i];
        }
        if(end == sz - 1){
            return n;
        }
        int same = 1;
        for(int i = end; i >= 1; i--){
            if(str[i] == str[i - 1]){
                same++;
            }else{
                break;
            }
        }
        str[end + 1 - same] -= 1;
        return stoi(str.substr(0, end + 2 - same) + string(sz - end + same - 2, '9'));
    }
};

968.监控二叉树

  • 题目链接: https://leetcode.cn/problems/binary-tree-cameras/description/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    int minCameraCover(TreeNode* root) {
        function<tuple<int, int, int>(TreeNode *)> dfs = 
            [&](TreeNode *node)->tuple<int, int, int>{
                if(node == nullptr){
                    return {INT_MAX / 2, 0, 0};
                }
                auto [l_choose, l_by_parent, l_by_children] = dfs(node->left);
                auto [r_choose, r_by_parent, r_by_children] = dfs(node->right);
                int choose = min(l_choose, l_by_parent) + min(r_choose, r_by_parent) + 1;
                int by_parent = min(l_choose, l_by_children) + min(r_choose, r_by_children);
                int by_children = min({l_choose + r_by_children, l_by_children + r_choose, l_choose + r_choose});
                return {choose, by_parent, by_children};
            };
        auto [choose, _, by_children] = dfs(root);
        return min(choose, by_children);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值