贪心算法专题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;
    }
相关推荐
顶点多余3 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考4 小时前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60165 小时前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘6 小时前
算法详解4:买卖股票的最佳时机系列(上)
算法
楠楠子呀7 小时前
客户数据清洗与质量管理的通用流程
贪心算法·散列表·memcached·模拟退火算法·testlink
维克兜率天8 小时前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源9 小时前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang
老当益壮梁奶奶9 小时前
Linux软件编程学习笔记(八):进程间通信详解(1)
linux·c语言·笔记·学习·算法
不会就选b9 小时前
算法日常・每日刷题--<BFS拓扑排序>4
算法
不正经学生9 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试