贪心算法专题Day22

56. 合并区间

sort排序

遇到能合并的就合并,不能合并的就先将之前合并完的区间push到result里,再更新start和end

处理末尾剩下的最后一个区间

cpp 复制代码
    static bool cmp(const vector<int>&a, const vector<int>&b){
        if(a[0] == b[0]){
            return a[1] < b[1];
        }
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        sort(intervals.begin(), intervals.end(), cmp);
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i = 1; i < intervals.size(); i++){
            if(intervals[i][0] <= end){
                end = max(end, intervals[i][1]);
            }
            else {
                res.push_back(vector<int>{start, end});
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        res.push_back(vector<int>{start, end});
        return res;
    }

738. 单调递增的数字

暴力法:从n开始倒数,判断每个数字是否是合法的

会超时。

cpp 复制代码
bool isVaild(int n){
        int pre = n % 10;
        n /= 10;
        while(n){
            if(n%10 > pre){
                return false;
            }
            pre = n%10;
            n /= 10;
        }
        return true;
    }
    int monotoneIncreasingDigits(int n) {
        for(int i = n; i >= 0; i--){
            if(isVaild(i)){
                return i;
            }
        }
        return 0;
    }

贪心:向前遍历,前一项大于后一项,前一项就减1,后面所有都变成9

cpp 复制代码
    int monotoneIncreasingDigits(int n) {
        string s = to_string(n);
        int len = s.size();
        int flag = len; 

        for (int i = len - 1; i > 0; i--) {
            if (s[i - 1] > s[i]) {
                flag = i;    // 标记从i开始,所有位都要设为9
                s[i - 1]--;  
            }
        }
        for (int i = flag; i < len; i++) {
            s[i] = '9'; 
        }

        return stoi(s);
    }

968. 监控二叉树

后序遍历, 一步一步往上穿

// 0 无覆盖, 1 摄像头, 2 有覆盖

由于叶子结点不能为摄像头(这样有点亏),所以空节点是有覆盖状态,叶子节点就是无覆盖状态了

cpp 复制代码
int count = 0;
    int traversal(TreeNode* cur){
        // 0 无覆盖, 1 摄像头, 2 有覆盖
        if(cur == nullptr){
            return 2;
        }
        int left = traversal(cur->left);
        int right = traversal(cur->right);
        if(left == 2 && right == 2){
            return 0;
        }
        else if(left == 0 || right == 0){
            count++;
            return 1;
        }
        else if(left == 1 || right == 1){
            return 2;
        }
        return -1;
    }
    int minCameraCover(TreeNode* root) {
        if(traversal(root) == 0){
            count++;
        }
        return count;
    }
相关推荐
追随者永远是胜利者1 小时前
(LeetCode-Hot100)253. 会议室 II
java·算法·leetcode·go
Jason_Honey22 小时前
【平安Agent算法岗面试-二面】
人工智能·算法·面试
程序员酥皮蛋2 小时前
hot 100 第三十五题 35.二叉树的中序遍历
数据结构·算法·leetcode
追随者永远是胜利者2 小时前
(LeetCode-Hot100)207. 课程表
java·算法·leetcode·go
仰泳的熊猫3 小时前
题目1535:蓝桥杯算法提高VIP-最小乘积(提高型)
数据结构·c++·算法·蓝桥杯
那起舞的日子3 小时前
动态规划-Dynamic Programing-DP
算法·动态规划
闻缺陷则喜何志丹3 小时前
【前后缀分解】P9255 [PA 2022] Podwyżki|普及+
数据结构·c++·算法·前后缀分解
每天吃饭的羊4 小时前
时间复杂度
数据结构·算法·排序算法
ValhallaCoder5 小时前
hot100-堆
数据结构·python·算法·
小小小米粒5 小时前
函数式接口 + Lambda = 方法逻辑的 “插拔式解耦”
开发语言·python·算法