【代码随想录】刷题笔记Day39

前言

  • 下午答疑课过于无聊了,后台在跑代码也写不了作业,再刷点题吧~难得一天两篇

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

  • 和之前重叠区间是同个类型,和res里的元素比较,重叠就更新res里最后元素的最右边界
cpp 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        if (intervals.size() == 0) return result; // 区间集合为空直接返回
        // 排序的参数使用了lambda表达式
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});

        // 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并
        result.push_back(intervals[0]); 

        for (int i = 1; i < intervals.size(); i++) {
            if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间
                // 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的
                result.back()[1] = max(result.back()[1], intervals[i][1]); 
            } else {
                result.push_back(intervals[i]); // 区间不重叠 
            }
        }
        return result;
    }
};

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

  • 暴力超时,从后往前遍历,如果前大于后,前-1,后全变9
cpp 复制代码
class Solution {
public:
//从后往前遍历,如果前面的字符较大,则减1,后面的会更新成9
	int monotoneIncreasingDigits(int n) {
		string s = to_string(n);
		int len = s.size();
		int index = len;  //哪个地方往后需要全变成9
		//初始化为len,因为如果像1234这样不需要更改的,index应从尾部+1开始变9
		for (int i = len - 1; i > 0; i--) {
			if (s[i - 1] > s[i]) {
				s[i - 1]--;
				index = i;
            // 这里不直接将s[i]变为9,是因为当两相邻数相等时,
            // 不会满足修改条件,最终结果不符合要求 ,
            // 如1000,后两位相等,最后结果会变成900,明显应该是999才对
			}
		}
		for (int i = index ; i < len ;i++) s[i] = '9';
        //最后转为数字
        return stoi(s);
	}
};

968. 监控二叉树 - 力扣(LeetCode)

  • 综合回溯(二叉树递归后序遍历) + 贪心(从叶子节点想覆盖)+ 各种考虑情况,直接抄
cpp 复制代码
// 版本一
class Solution {
private:
    int result;
    int traversal(TreeNode* cur) {

        // 空节点,该节点有覆盖
        if (cur == NULL) return 2;

        int left = traversal(cur->left);    // 左
        int right = traversal(cur->right);  // 右

        // 情况1
        // 左右节点都有覆盖
        if (left == 2 && right == 2) return 0;

        // 情况2
        // left == 0 && right == 0 左右节点无覆盖
        // left == 1 && right == 0 左节点有摄像头,右节点无覆盖
        // left == 0 && right == 1 左节点有无覆盖,右节点摄像头
        // left == 0 && right == 2 左节点无覆盖,右节点覆盖
        // left == 2 && right == 0 左节点覆盖,右节点无覆盖
        if (left == 0 || right == 0) {
            result++;
            return 1;
        }

        // 情况3
        // left == 1 && right == 2 左节点有摄像头,右节点有覆盖
        // left == 2 && right == 1 左节点有覆盖,右节点有摄像头
        // left == 1 && right == 1 左右节点都有摄像头
        // 其他情况前段代码均已覆盖
        if (left == 1 || right == 1) return 2;

        // 以上代码我没有使用else,主要是为了把各个分支条件展现出来,这样代码有助于读者理解
        // 这个 return -1 逻辑不会走到这里。
        return -1;
    }

public:
    int minCameraCover(TreeNode* root) {
        result = 0;
        // 情况4
        if (traversal(root) == 0) { // root 无覆盖
            result++;
        }
        return result;
    }
};

后言

  • 正好5点结束!干饭去咯!去吃吃新修的怡膳堂怎么样!!
相关推荐
王老师青少年编程16 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮1 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说1 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove2 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
小程故事多_802 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
leoufung2 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了2 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL2 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰3 小时前
C++ 排列组合完整指南
开发语言·c++·算法
love530love3 小时前
精简版|Claude-HUD 插件介绍 + 一键安装教程
人工智能·windows·笔记