每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/merge-intervals/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度是中等
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
public class Solution {
public int[][] merge(int[][] intervals) {
int len = intervals.length;
if (len < 2) {
return intervals;
}
//这里先进行一个排序,比较的大小是每个数组的第一位
Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);
//定义一个list去装数组,等后面在转化
List<int[]> res = new ArrayList<>();
//先给定一个初始的值,就取数组里最小的第一个
res.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
//这里主要是判断去取倒数第一位数组的值
//因为前面是已经排序好了的数组
int[] ints = res.get(res.size() - 1);
/*
* 其实这里只需要两个判断,一个是判断第一个数组的最后一位是否
* 在第二个数组的第一位大,如果大肯定是需要重叠判断;
* 如果小的话,直接加到list里面,继续第二次循环
* 举个栗子:
* [1,3] 和 [2,4] ,这个是需要重合判断的
* [1,3] 和 [5,7],这个是不需要比较的
* */
if(ints[1] < intervals[i][0]){
res.add(intervals[i]);
}else if(ints[1] < intervals[i][1]){
ints[1] = intervals[i][1];
}
}
return res.toArray(new int[res.size()][2]);
}
public static void main(String[] args) {
Solution solution = new Solution();
int[][] intervals = {{1, 3}, {2, 6}, {6, 10}, {15, 18}};
int[][] res = solution.merge(intervals);
for (int i = 0; i < res.length; i++) {
System.out.println(Arrays.toString(res[i]));
}
}
}
上一篇文章:每天一道算法题系列三十六之跳跃游戏
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。