✅作者简介:我是18shou,一名即将秋招的java实习生
✨个人主页:_18shou
系列专栏:牛客刷题专栏
在线刷题面经模拟面试
题目主要信息:
方法: 排序+贪心(推荐使用)
知识点:贪心思想
贪心思想属于动态规划思想中的一种,其基本原理是找出整体当中给的每个局部子结构的最优解,并且最终将所有的这些局部最优解结合起来形成整体上的一个最优解。
什么样的区间能够合并,那肯定是有交叉的区间,即后一个区间的尾小于前一个区间的首,这时候可以将这种交叉区间的尾合并延长区间:
//区间有重叠,更新结尾
if(intervals[i].start <= res.back().end)
res.back().end = max(res.back().end, intervals[i].end);
那我们肯定是区间在一定程度上有序的才可以方便比较(区间有两个边界值,完全有序不可能,但是可以按照区间首排序),这时候只要遍历到交叉的情况,就利用贪心思想,一直合并,直到不能合并为止。
具体做法:
import java.util.*;
public class Solution {
public ArrayList merge(ArrayList intervals) {
ArrayList res = new ArrayList<>();
//去除特殊情况
if(intervals.size() == 0)
return res;
//重载比较,按照区间首排序
Collections.sort(intervals, new Comparator(){
public int compare(Interval o1, Interval o2){
if(o1.start != o2.start)
return o1.start - o2.start;
else
return o1.end - o2.end;
}
});
//放入第一个区间
res.add(intervals.get(0));
int count = 0;
//遍历后续区间,查看是否与末尾有重叠
for(int i = 1; i < intervals.size(); i++){
Interval o1 = intervals.get(i);
Interval origin = res.get(count);
if(o1.start > origin.end){
res.add(o1);
count++;
//区间有重叠,更新结尾
}else{
res.remove(count);
Interval s = new Interval(origin.start, o1.end);
if(o1.end < origin.end)
s.end = origin.end;
res.add(s);
}
}
return res;
}
}
兄弟们,一起来刷题写题