代码随想录-算法训练营day35(贪心算法05:无重叠区间,划分字母区间,合并区间)

bash 复制代码
第八章 贪心算法 part05
 
● 435. 无重叠区间 
● 763.划分字母区间 
● 56. 合并区间 
 
 详细布置  
 
今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 
还是属于那种,做过了也就会了,没做过就很难想出来。
不过大家把如下三题做了之后, 重叠区间 基本上差不多了
 
 435. 无重叠区间 
 
https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html  
 
 763.划分字母区间 
 
https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html  
 
 56. 合并区间  
本题相对来说就比较难了。
 
https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html  
 
往日任务
● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY  
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG  
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6 
● day 4 任务以及具体安排:https://docs.qq.com/doc/DUFNjYUxYRHRVWklp 
● day 5 周日休息
● day 6 任务以及具体安排:https://docs.qq.com/doc/DUEtFSGdreWRuR2p4 
● day 7 任务以及具体安排:https://docs.qq.com/doc/DUElCb1NyTVpXa0Jj 
● day 8 任务以及具体安排:https://docs.qq.com/doc/DUGdsY2JFaFhDRVZH 
● day 9 任务以及具体安排:https://docs.qq.com/doc/DUHVXSnZNaXpVUHN4 
● day 10 任务以及具体安排:https://docs.qq.com/doc/DUElqeHh3cndDbW1Q 
●day 11 任务以及具体安排:https://docs.qq.com/doc/DUHh6UE5hUUZOZUd0 
●day 12 周日休息 
●day 13 任务以及具体安排:https://docs.qq.com/doc/DUHNpa3F4b2dMUWJ3 
●day 14 任务以及具体安排:https://docs.qq.com/doc/DUHRtdXZZSWFkeGdE 
●day 15 任务以及具体安排:https://docs.qq.com/doc/DUHN0ZVJuRmVYeWNv 
●day 16 任务以及具体安排:https://docs.qq.com/doc/DUHBQRm1aSWR4T2NK 
●day 17 任务以及具体安排:https://docs.qq.com/doc/DUFpXY3hBZkpabWFY 
●day 18 任务以及具体安排:https://docs.qq.com/doc/DUFFiVHl3YVlReVlr 
●day 19 周日休息
●day 20 任务以及具体安排:https://docs.qq.com/doc/DUGFRU2V6Z1F4alBH  
●day 21 任务以及具体安排:https://docs.qq.com/doc/DUHl2SGNvZmxqZm1X 
●day 22 任务以及具体安排:https://docs.qq.com/doc/DUHplVUp5YnN1bnBL  
●day 23 任务以及具体安排:https://docs.qq.com/doc/DUFBUQmxpQU1pa29C 
●day 24 任务以及具体安排:https://docs.qq.com/doc/DUEhsb0pUUm1WT2NP  
●day 25 任务以及具体安排:https://docs.qq.com/doc/DUExTYXVzU1BiU2Zl 
●day 26 休息 
●day 27 任务以及具体安排:https://docs.qq.com/doc/DUElpbnNUR3hIbXlY 
●day 28 任务以及具体安排:https://docs.qq.com/doc/DUG1yVHdlWEdNYlhZ  
●day 29 任务以及具体安排:https://docs.qq.com/doc/DUHZYbWhwSHRCRmp3 
●day 30 任务以及具体安排:https://docs.qq.com/doc/DUEdTVVhxbnJiY3BR 
●day 31 任务以及具体安排:https://docs.qq.com/doc/DUG1PQ1ZZY2xXY1ly 
●day 32 任务以及具体安排:https://docs.qq.com/doc/DUGFEdGFWeVhleFF1 
●day 33 周日休息 
●day 34 任务以及具体安排:https://docs.qq.com/doc/DUEh5WFVlQkp1U0p4  
●day 35 任务以及具体安排:https://docs.qq.com/doc/DUFRWc3BGRHFXZ1pO

day35

三道重叠区间问题,前两个只需要计数,合并区间需要知道区间起点终点坐标

无重叠区间

复制代码
 class Solution {
     public int eraseOverlapIntervals(int[][] intervals) {
         //左边界排序,intervals[i][0]>intervals[i - 1][1],则两者左右重合,重合更新[i][1]为两者右边界小数值,然后继续比较
         //else 不重合,count++
         //最后让length - count
         Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));
         int count = 1;
         for( int i = 1; i < intervals.length; i++){
             if(intervals[i][0] < intervals[i-1][1]){//重合
                 intervals[i][1] = Math.min(intervals[i][1],intervals[i-1][1]);
             }else{//不重合
                 count++;
             }
         }
         return intervals.length - count;
     }
 }

划分字母区间

复制代码
 class Solution {
     public List<Integer> partitionLabels(String s) {
         //统计每个字母出现的最远位置,left和right不断更新right直到i == right说明找到了分割点
         List<Integer> result = new ArrayList<>();
         int[] hash = new int[27];
         for( int i = 0; i < s.length(); i++){
             hash[s.charAt(i) - 'a'] = i;
         }
         int left = 0;
         int right = 0;
         for(int i = 0; i < s.length(); i++){
             right = Math.max( hash[s.charAt(i) - 'a'], right);
             if( right == i){
                 result.add(right - left + 1);
                 left = right + 1;
             }
         }
         return result;
     }
 }

合并区间

复制代码
 //相比较于前面两道题(射箭,重叠区间),本题需要返回区间起点和终点,left需要初始化
 //如果和射箭一样,每次[i][1] = min() 就无法得到正确的右边界了,right也需要初始化,需要设置left和right两个变量
 //add之后更新左边界,否则一直更新右边界
 class Solution {
     public int[][] merge(int[][] intervals) {
         List<int[]> res = new LinkedList<>();
         //按照左边界排序
         Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));
         //initial start 是最小左边界
         int start = intervals[0][0];
         int rightmostRightBound = intervals[0][1];
         for (int i = 1; i < intervals.length; i++) {
             //如果新来的左边界大于最大右边界,也就是下一个不重合了
             if (intervals[i][0] > rightmostRightBound) {
                 //加入区间 并且更新start
                 res.add(new int[]{start, rightmostRightBound});
                 start = intervals[i][0];
                 rightmostRightBound = intervals[i][1];
             } else {
                 //更新最大右边界
                 rightmostRightBound = Math.max(rightmostRightBound, intervals[i][1]);
             }
         }
         res.add(new int[]{start, rightmostRightBound});//最后还要再add最后一个
         return res.toArray(new int[res.size()][]);
     }
 }

感谢大佬分享:

代码随想录-算法训练营day35【贪心算法05:无重叠区间、划分字母区间、合并区间】-CSDN博客

相关推荐
Sagittarius_A*7 分钟前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
Patrick在香港12 分钟前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术24 分钟前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫33 分钟前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话41 分钟前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠1 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
砚凝霜1 小时前
软考网络工程师|第 6 章 密码学、哈希、数字签名、数字证书 PKI 完整备考笔记
笔记·密码学·哈希算法
QAQo7T2 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai2 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场2 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces