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

代码随想录算法训练营第60期第三十五天打卡

       今天是我们贪心算法章节的最后一天,今天有三道题目需要讲解,但是最后又一道题目叫做监督二叉树的题目难度比较大,我打算二刷代码随想录的时候再来给大家讲解,因此我们今天就只讲解前两道题目,昨天的区间重叠问题是贪心算法里面很重要的一种题型,今天还有一道区间重叠的问题,这样的话我们整个代码随想录已经刷完一半多了,还有一个动态规划与图论就刷完代码随想录了,当然一刷肯定存在很多不扎实的地方,我会二刷再来巩固的,那我们就开始今天的内容。

第一题对应力扣编号为56的题目合并区间

      这一道题其实只看题目就差不多可以看出这又是一道贪心算法的题目,区间合并很明显与我们前面的弓箭射气球和无重叠区间的问题存在异曲同工之妙,那我们就直接看一下这一道题目的具体要求:

        题目的要求是我们合并所有有重叠的区间,最后返回一个数组使得数组里面的所有区间包含了我们原数组的区间,很明显我们肯定是需要判断两个区间是不是重合的,那我们就一起看一下解题思路,大家只要把昨天的区间重复问题搞明白了其实这道题目就很简单了,因为两者完全就是同一个思路,我们就是看两个区间是否有重叠,我们先把第一个区间放入结果集,接下来遍历所有的区间,我们看的是前一个区间的右边界与后一个区间的左边界,如果前一个区间的右边界大于等于后一个区间的左边界的话说明两个区间有重合,那我们合并就是更新右边界,但同学会问会不会后一个区间的左边界会不会比前一个区间的左边界还要小,不会的,因为我们早就按照区间左边界排好序了,因此我们可以很轻松的写出本题的解题代码:

class Solution {
private:static bool cmp(const vector<int> &a, const vector<int> &b){return a[0] < b[0];}
public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>> result;if (intervals.size() == 0) return result;//按照区间的左边界排序sort(intervals.begin(), intervals.end(), cmp);//我们首先将第一个区间放入结果集中无论合不合并都要在它的基础上操作result.push_back(intervals[0]);for (int i = 1; i < intervals.size(); ++i){//如果前一个区间的右边界大于后一个区间的左边界的话就应该合并if (result.back()[1] >= intervals[i][0]){//合并的话我们更新的是右区间result.back()[1] = max(result.back()[1], intervals[i][1]);}else{result.push_back(intervals[i]);}}return result;}
};

      这样大家应该可以看懂这段代码,这道题目我们就讲解到这里,我们接着看下一道题目。

第二题对应力扣编号为738的题目单调递增的数字

        这道题目经过最近几天的刷题写题解我可以很轻松看出这必然是一道贪心算法的题目,不是因为它被放在贪心算法章节了,我们还是直接看一下题目要求:

       什么意思呢?我们看一下相邻位数上的数字也就是说按照位数越往后的数字应该是越来越大起码不能比原来要小,至少是大于等于,很明显本题目是贪心算法,我们直接考虑暴力法当然一定会超时的,但是我还是给出大家暴力法的代码,大家可以学习一下:

class Solution {
private:// 判断一个数字的各位上是否是递增bool checkNum(int num) {int max = 10;while (num) {int t = num % 10;if (max >= t) max = t;else return false;num = num / 10;}return true;}
public:int monotoneIncreasingDigits(int N) {for (int i = N; i > 0; i--) { // 从大到小遍历if (checkNum(i)) return i;}return 0;}
};

        大家学一下这种取这个数字的每一位数字的思想,大家注意我们先取出来的应该是最后的一位,但是这种暴力方法是不可以的,我们需要考虑其他的思路,大家可以思考一下我们如果把这个数字转换成字符串,我暂时从前往后遍历字符串,如果发现前面的数字大于后面的这就说明不是单调递增的数字,这时候我们就把前面的数字减减,然后后面的那一位设置为9,9是最大的个位数肯定可以单调递增,比如说98,前面的数字大于后面的数字,因此我们要去寻找小于等于这个数字的最大的单调递增的数字,很明显我先把前面的数字减减,后面的改为9就是89,为什么前面的数字要减减因为我们的数字要求位数越往后数字的值越大,理解了这一点题目或许就有了思路,但是我们还是需要考虑我们应该从后往前遍历还是从前往后遍历,大家思考如果我们从前往后遍历的话我们发现strNum[i - 1] > strNum[i],如果进行strNum[i - 1]--,就会出现可能又小于strNum[i - 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);}
};

       这里我以示例1为例说明为什么从前往后不可以,332我遍历到2的时候我发现是比前面的一位小了,因此根据我们的规则我应该前面一位减减这一位变成9,所以会得到329很明显这个数字不符合题意,同时我前一位减减以后我们是不是这个2就比它前面的3小了也不符合题意,但如果我们从后往前遍历的话,我们发现3比2大,我们会先变成329接下来我们会发现2还是小于3因此我们前面的一位减减,这一位我们变为9,因此我们得到了299,这个思路是合理的,因此我们上面的代码我们使用flag来存储9应该存在的位置,最后我们排除了所有前面的数字大于后面的数字的时候我们再把9补充就可以了,这就是我们这一道题的思路。

贪心算法大总结

       到今天为止我们的贪心算法就讲解完毕了,其实大家应该记得我们刚开始的时候就强调过贪心算法没有任何固定的套路与模板,我们的总体思路是从局部最优退出全局最优,我们主要将结果几道简单的题目比如小孩分饼干,柠檬水找零等,也有分发糖果等多维度分析问题,还是最近一直在讲的区间问题,比如今天的合并区间,这些其实如果大家没有接触过的话并不好想到思路,好了,明天开始我们就走进动态规划,动态规划是比较难的,尤其是dp数组大家要搞清楚我这个数组到底表示的是什么以及它的初始化的问题,接下来的背包问题(包括一维背包与二维背包问题)都是比较难的,还是最后的图论,包括dfs与bfs大家要坚持下去,我们明天的动态规划见!

相关文章:

  • k8s v1.26 实战csi-nfs 部署
  • R语言绘图 | 渐变火山图
  • STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
  • MySQL索引底层数据结构与算法
  • 如何配置activemq,支持使用wss协议连接。
  • 如何避免和恢复因终端关闭导致的 LoRA 微调中断
  • 无锡哲讯科技:引领芯片封装SAP系统的智能化革命
  • 前端性能优化3:深入分析 Web Worker 和 Service Worker
  • Gmsh+OCC对应版本库编译
  • LabVIEW 程序运行时内存不足报错原因
  • 故障诊断模型评估——混淆矩阵,如何使样本量一致(上)
  • 【计算机组成原理】第二部分 存储器--分类、层次结构
  • Linux的域名解析服务器
  • 专题四:综合练习( 找出所有子集的异或总和再求和)
  • 每日Prompt:发光线条解剖图
  • 华秋2025电子设计与制造技术研讨会(华东站)成功举办!
  • 技术干货 | 如何用模块化仪器高效测试嵌入式微控制器?
  • 嵌入式培训之数据结构学习(二)顺序表与单向链表
  • 手机换IP真的有用吗?可以干什么?
  • 解锁向量数据库:实现高效过滤与管理的实用方法
  • 中国巴西民间推动建立经第三方验证的“森林友好型”牛肉供应链
  • 周启鸣加盟同济大学,曾任香港浸会大学深圳研究院院长
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10千米
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 印度外交秘书:印巴军方将于12日再次对话
  • 五粮液董事长:茅台1935已脱离千元价位带,五粮液在千元价位已逐步摆脱其他竞品纠缠