首页 > 编程语言 >代码随想录算法训练营第36期DAY38

代码随想录算法训练营第36期DAY38

时间:2024-05-25 16:02:11浏览次数:24  
标签:return DAY38 int ed 随想录 36 intervals vector res

DAY38

435无重叠区间

昨晚很快就想出来了,今天相当于二刷。

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[1]<b[1];
  5.     }
  6.     int eraseOverlapIntervals(vector<vector<int>>& intervals) {
  7.         int res=0;
  8.         sort(intervals.begin(),intervals.end(),mycmp);
  9.         int end=intervals[0][1];
  10.         for(int i=1;i<intervals.size();i++){
  11.             if(intervals[i][0]<end){
  12.                 res++;
  13.                 continue;
  14.             }
  15.             end=intervals[i][1];
  16.         }
  17.         return res;
  18.     }
  19. };

763划分字母区间

  1. COZE的解法:记录每个元素的最终位置,如果当前遍历到了元素的最终位置,就将长度加入到结果集中。写得很巧妙,不容易想到:很多变量的使用技巧、算法设计。之后吸收其他优质题解,先自己按着算法思路写一遍:

动手模拟一遍,就掌握该算法了:

  1. class Solution {
  2. public:
  3.     vector<int> partitionLabels(string s) {
  4.         vector<int> res;
  5.         vector<int> last(26,0);
  6.         for(int i=0;i<s.size();i++){
  7.             last[s[i]-'a']=max(last[s[i]-'a'],i);
  8.         }
  9.         int j=0,anthor=0;
  10.         for(int i=0;i<s.size();i++){
  11.             j=max(j,last[s[i]-'a']);
  12.             if(i==j){
  13.                 res.push_back(j-anthor+1);
  14.                 anthor=i+1;
  15.             }
  16.         }
  17.         return res;
  18.     }
  19. };

  1. 力扣优质题解,3份,加深记忆

想切割,要有首尾两个指针,确定了结尾指针,就能确定下一个切割的开始指针。
遍历字符串,如果已扫描部分的所有字符,都只出现在已扫描的范围内,即可做切割。

出自力扣博主:笨猪爆破组(https://leetcode.cn/u/xiao_ben_zhu/)

力扣数学描述:出自力扣官方题解:(https://leetcode.cn/u/leetcode-solution/)

  1. 代码随想录题解

需要额外学习:与区间操作类似的解法:

统计字符串中所有字符的起始和结束位置,记录这些区间,将区间按左边界从小到大排序,找到边界将区间划分成组,互不重叠。找到的边界就是答案。

过了,二刷一下:

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[0]<b[0];
  5.     }
  6.     vector<vector<int>> CountHash(string s){
  7.         vector<vector<int>> hash(26,vector<int>(2,INT_MIN));
  8.         vector<vector<int>> hashfilter;
  9.         for(int i=0;i<s.size();i++){
  10.             if(hash[s[i]-'a'][0]==INT_MIN) hash[s[i]-'a'][0]=i;
  11.             hash[s[i]-'a'][1]=i;
  12.         }
  13.         for(int i=0;i<hash.size();i++){
  14.             if(hash[i][0]!=INT_MIN) hashfilter.push_back(hash[i]);
  15.         }
  16.         return hashfilter;
  17.     }
  18.     vector<int> partitionLabels(string s) {
  19.         vector<int> res;
  20.         vector<vector<int>> tmp=CountHash(s);
  21.         sort(tmp.begin(),tmp.end(),mycmp);
  22.         int st=0,ed=tmp[0][1];
  23.         for(int i=1;i<tmp.size();i++)
  24.         {
  25.             if(tmp[i][0]>ed){
  26.                 res.push_back(ed-st+1);
  27.                 st=tmp[i][0];
  28.             }
  29.             ed=max(ed,tmp[i][1]);
  30.         }
  31.         res.push_back(ed-st+1);
  32.         return res;
  33.     }
  34. };

56合并区间

模版题,昨天正好复习了ACWING区间合并模版:

  1. class Solution {
  2. public:
  3.     static bool mycmp(vector<int>&a,vector<int>&b){
  4.         return a[0]<b[0];
  5.     }
  6.     vector<vector<int>> merge(vector<vector<int>>& intervals) {
  7.         vector<vector<int>> res;
  8.         int st=INT_MIN,ed=INT_MIN;
  9.         sort(intervals.begin(),intervals.end(),mycmp);
  10.         for(int i=0;i<intervals.size();i++){
  11.             //不重叠
  12.             if(ed<intervals[i][0]){
  13.                 if(ed!=INT_MIN) res.push_back({st,ed});
  14.                 st=intervals[i][0],ed=intervals[i][1];
  15.             }
  16.             //重叠  
  17.             else{
  18.                 ed=max(intervals[i][1],ed);
  19.             }
  20.         }
  21.         res.push_back({st,ed});
  22.         return res;
  23.     }
  24. };

标签:return,DAY38,int,ed,随想录,36,intervals,vector,res
From: https://blog.csdn.net/illuosion7/article/details/139186510

相关文章

  • 代码随想录算法训练营第36期DAY39
    道心破碎的一天,继续加油吧,坚持努力。DAY39738单调递增的数字暴力法:没有想到用inti=n;i>0;i--来遍历。class Solution {private:    bool checknum(int num){        if(num<10) return true;        while(num/10!=0){           ......
  • 代码随想录算法训练营第36期DAY37
    DAY37先二刷昨天的3道题目,每种方法都写:是否已完成:是。报告:134加油站的朴素法没写对。原因是:在if中缺少了store>=0的判断,只给出了index==i的判断。前进法没写出来。因为忘记了总油量的判断。Sum。注意变量的初始化。分配糖果注意if里面放的是ratings;860柠檬水找零网上摘得思......
  • 代码随想录——二叉树的所有路径(Leetcode257)需要回顾
    题目链接BFS+队列维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时广度优先搜......
  • 代码随想录算法训练营第一天 | 977.有序数组的平方;
    代码随想录算法训练营第一天|977.有序数组的平方;977题链接:https://leetcode.cn/problems/squares-of-a-sorted-array/代码随想录链接:https://programmercarl.com/0977.有序数组的平方.html#思路209题链接:https://leetcode.cn/problems/minimum-size-subarray-sum/submission......
  • 代码随想录算法训练营第第17天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    三道题都没想出来,还是要加强递归的练习110.平衡二叉树(优先掌握递归)再一次涉及到,什么是高度,什么是深度,可以巩固一下。题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.平衡二叉树.htmlfunctiongetHeight(node){if(node===null)return0;letleftH......
  • 新定义RD8T36P48使用USCI0的TWI功能点亮OLED
    时间不多,因此先只给出工程,等有时间再添加详细说明现象这是从之前的一个51单片机的程序移植过来的,主要修改了IIC启动和停止,以及数据发送的代码,我现在还不是很满意的一点是发送过程中要等待上一个字节发送完才能接着发送本次字节。我使用的是while循环等待发送完成标志位,......
  • 新定义RD8T36P48点亮LED--汇编
    其实汇编和C语言差不多,简单的东西用汇编挺好,中等及以上复杂度的程序还是C语言更灵活直接在keil新建好工程,选好芯片型号和下载方式,再创建一个.asm文件并添加到工程,工程创建完如图工程配置代码 ORG0000H LJMPMAIN ORG0100HMAIN: MOVA,9AH ORLA,#20H;让P05为......
  • 算法随想录打卡第三天|链表
    //203移除链表元素publicListNoderemoveElements(ListNodehead,intval){//创建虚拟头指针不对//ListNoderes=head;//创建一个虚拟头结点ListNoderes=newListNode(val-1);res.next=head;ListNodeprev=res;......
  • 代码随想录算法训练营第一天 | 704.二分查找;27. 移除元素
    代码随想录算法训练营第一天|704.二分查找(红蓝模板法);27.移除元素(双指针法)704题链接:https://leetcode.cn/problems/binary-search/description/二分查找:https://programmercarl.com/0704.二分查找.html#其他语言版本二分查找红蓝法笔记:二分查找为什么总是写错?_哔哩哔哩_bil......
  • 代码随想录算法训练营第十五天 | 层序遍历 、226.翻转二叉树、101.对称二叉树
    层序遍历题目链接:学会二叉树的层序遍历,可以一口气打完以下十题:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点......