贪心算法专题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;
    }
相关推荐
卷福同学7 小时前
QClaw内测体验,能用微信指挥AI干活了
人工智能·算法·ai编程
sali-tec7 小时前
C# 基于OpenCv的视觉工作流-章34-投影向量
图像处理·人工智能·opencv·算法·计算机视觉
xiaoye-duck7 小时前
《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂
数据结构·c++·算法·递归
Eward-an7 小时前
【算法竞赛/大厂面试】盛最多水容器的最大面积解析
python·算法·leetcode·面试·职场和发展
山栀shanzhi7 小时前
归并排序(Merge Sort)原理与实现
数据结构·c++·算法·排序算法
阿豪学编程7 小时前
LeetCode438: 字符串中所有字母异位词
算法·leetcode
Trouvaille ~7 小时前
【递归、搜索与回溯】专题(七):FloodFill 算法——勇往直前的洪水灌溉
c++·算法·leetcode·青少年编程·面试·蓝桥杯·递归搜索回溯
地平线开发者7 小时前
征程 6P codec decoder sample
算法·自动驾驶
地平线开发者8 小时前
征程 6X Camera 接入数据评估
算法·自动驾驶
Storynone8 小时前
【Day23】LeetCode:455. 分发饼干,376. 摆动序列,53. 最大子序和
python·算法·leetcode