继续打卡算法题,今天学习的是LeetCode第56题合并区间,这道题目是道中等题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
看完题目,这个题目还是比较好理解的,解决这个题目,我们只要保证区间集合是有序的
,接下来我们只要判断两个区间重叠,然后合并两个区间。
区间重叠怎么判断呢?
比如上面两个区间,我们发现只要一个区间的开始小于前一个区间的结尾
,那么他们就是重叠的。
接下来就只剩下合并区间了。
合并两个区间,我们计算两个区间开始最小值
,两个区间的最大值
,这样就得到了合并后的区间。
本题解题技巧
1、按区间左边界升序排序
2、理解重叠区间
3、掌握合并两个区间
编码解决
class Solution {
public int[][] merge(int[][] intervals) {
//存储结果
LinkedList<int[]> result = new LinkedList<>();
//按左边界排序
Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
//第一个先加入结果
result.add(intervals[0]);
//从第二个开始判断是否重叠
for (int i = 1; i < intervals.length; i++) {
//和前面的重叠了
if (intervals[i][0] <= result.getLast()[1]) {
int start = result.getLast()[0];
int end = Math.max(intervals[i][1], result.getLast()[1]);
//合并之前,最后一个需要删除
result.removeLast();
//合并成新区间,并加入结果
result.add(new int[]{
start, end});
}
else {
//没有重叠,加入结果
result.add(intervals[i]);
}
}
return result.toArray(new int[result.size()][]);
}
}
总结
本题并不难,只要知道重叠区间判断
和合并区间操作
就可以解决本题。