当前位置: 首页 > news >正文

3.26 代码随想录第二十七天打卡

56. 合并区间

(1)题目描述:

(2)解题思路:

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;
    }
};

(3)总结:

1.还是先排序,如果前后遇到重叠,要合并区间,直接将前一个数组的左边界作为新数组的左边界(因为排过序后小的一定在前),再比较两者右边界的和取其中较大的
2.  []  :这是 lambda 表达式的开始。方括号内的参数列表为空,表示这个 lambda 表达式不接受外部参数。
3. (const vector<int>& a, const vector<int>& b)  :这是 lambda 表达式的参数列表。这里有两个参数   a   和   b  ,它们都是   const vector<int>&   类型的引用。这意味着   a   和   b   是两个常量引用,指向   vector<int>   类型的容器。
4. { return a[0] < b[0]; }  :这是 lambda 表达式的函数体。它返回   a[0] < b[0]   的结果。这里的   a[0]   和   b[0]   分别表示   a   和   b   这两个   vector   的第一个元素。整个表达式返回一个布尔值,表示   a   的第一个元素是否小于   b   的第一个元素

738.单调递增的数字

(1)题目描述:

(2)解题思路:

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string strNum = to_string(N);
        // flag用来标记赋值9从哪里开始
        // 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行
        int flag = strNum.size();
        for (int i = strNum.size() - 1; i > 0; i--) {
            if (strNum[i - 1] > strNum[i] ) {
                flag = i;
                strNum[i - 1]--;
            }
        }
        for (int i = flag; i < strNum.size(); i++) {
            strNum[i] = '9';
        }
        return stoi(strNum);
    }
};

(3)总结:

1。这道题应该从后向前遍历,如果不符合弟曾国要求就让前一位减一
2.想不通为什那么这个位置往后都要变为“9”的话,可以拿数字100举例,推一下
3.to_string(N)   是一个函数调用。它可以将各种类型的数值(如   int  、  float  、  double   等)转换为   string   类型。这里的   N   是一个变量,它的值将被转换为字符串
4.  stoi   函数会尝试将字符串   str   转换为一个整数,并返回转换后的整数值

968.监控二叉树

(1)题目描述:

(2)解题思路:

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
        if (left == 0 || right == 0) {
            result++;
            return 1;
        }

        // 情况3
        if (left == 1 || right == 1) return 2;
        // 这个 return -1 逻辑不会走到这里。
        return -1;
    }

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

(3)总结:

1.如果遇到叶子节点尽量在叶子节点的父节点上放摄像头,这样能保证最大范围,放的摄像头也就越少,在根节点的孩子节点上放摄像头(但叶子节点比根节点多所以优先考虑满足叶子节点情况)
2.注:要用后序遍历(左右中),隔两个节点放一个摄像头,其中还必须保证空节点是有摄像头的情况(另外两种情况不是最优的想一下)
3.每个节点有如下三种状态:
0该节点无覆盖
1本节点有摄像头
2本节点有覆盖
4.情况1:左右节点都有覆盖
左孩子有覆盖,右孩子有覆盖,那么此时中间节点应该就是无覆盖的状态了。
5.情况2:左右节点至少有一个无覆盖的情况
如果是以下情况,则中间节点(父节点)应该放摄像头
6.情况3:左右节点至少有一个有摄像头
如果是以下情况,其实就是 左右孩子节点有一个有摄像头了,那么其父节点就应该是2(覆盖的状态)
7.情况4:头结点没有覆盖
以上都处理完了,递归结束之后,可能头结点 还有一个无覆盖的情况,所以递归结束之后,还要判断根节点,如果没有覆盖,result++(再添个摄像头)

相关文章:

  • 参考文献格式对齐1-100
  • idea 快捷键
  • Harbor自建证书实现Https访问
  • LLVM学习-DragonEgg工具
  • 强化学习和智能决策:Q-Learning和Deep Q-Learning算法
  • 漫画|基于SprinBoot+vue的漫画网站(源码+数据库+文档)
  • 【0基础跟AI学软考高项】质量管理
  • PVE 安装黑苹果 MacOS
  • mac m3 pro 部署 stable diffusion webui
  • cJSON- API 深度解析:设计理念与实现原理(二)
  • 本地靶场的“作弊模式”?从单用户模式解锁网络与权限的秘密
  • 用Deepseek写扫雷uniapp小游戏
  • 【GPUStack】【dify】【RAGflow】:本地部署GPUStack并集成到dify和RAGflow
  • (基本常识)左值引用、右值引用、万能引用、移动语义和完美转发——原理和代码示例
  • Linux学习:进程通信(管道)
  • HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)
  • 微软下一个大更新:Windows 11 25H2或已在路上!
  • CSS(八)
  • Linux笔记---动静态库(使用篇)
  • 全书测试:《C++性能优化指南》
  • 高瓴、景林旗下公司美股持仓揭晓:双双增持中概股
  • 上百家单位展示AI+教育的实践与成果,上海教育博览会开幕
  • 高新波任西安电子科技大学校长
  • 央视起底“字画竞拍”网络传销案:涉案44亿元,受害者众多
  • 普京调整俄陆军高层人事任命
  • 董军在第六届联合国维和部长级会议上作大会发言