前言
🌟每天打卡一道算法题,既是学习的过程,又是养成习惯的过程💡
🌟算法练习包含最基础的程序员必备题以及LeetCode🎈
🌟今天是算法题打卡第5天!🗓
1、题目描述
合并区间
以数组 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] 可被视为重叠区间。
思路:
- 首先按照每个二维数组的第一个数字进行排序
- 设置start和end为当前区间的开始和结尾
- 遍历二维数组,如果下一个的起点小于当前区间的结尾,就说明这两个区间有重叠,需要去合并,此时要更新结尾
- 如果下一个的起点,大于当前区间的结尾,说明两个区间没有重叠,也就说明之前的start、end区间是一个独立的区间,要保存。
- 保存之后,要重新设置start、end值,继续往后遍历进而去合并。
举例:[ [1,3], [2,6], [8,10], [15,18] ]
最开始start=1、end=3,到[2,6],发现2<3(新的start<上一个的end),说明这两个区间有重叠,要进行合并,合并之后的结尾end=6。到[8,10],发现8>6(新的start>上一个的结尾),说明两个区间之间没有重叠,此时就要保存上一个的区间[1,6],这个是前两个区间合并的结果。保存之后,更新start=8,end=10,到[15,18],发现15>10(新的start>上一个的end),说明这两个区间没有重叠,要保存[8,10],这是上一个不重叠的区间。然后再去更新start=15,end=18。遍历结束了,保存当前的[15,18]([start,end]),这是最后一个区间。
public class leetcode03 {
public static void main(String[] args) {
int[][] array = {{1,3},{2,6},{8,10},{15,18}};
int[][] result = method1(array);
for (int[] ints : result) {
System.out.println(Arrays.toString(ints));
}
}
public static int[][] method1(int[][] intervals) {
if (intervals == null || intervals.length == 0){
return new int[0][];
}
//二维数组根据第一个数字排序
Arrays.sort(intervals, Comparator.comparing(a->a[0]));
List<Object> list = new ArrayList<>();
int start = intervals[0][0];
int end = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {//注意这里是从1开始的
if (intervals[i][0] <= end){ //说明当前区间的起始位置array[i][0]小于等于end,那就说明有重叠区间,end要取最大值
end = Math.max(end,intervals[i][1]);
}else {
list.add(new int[]{start,end}); // 将当前的区间
start = intervals[i][0];
end = intervals[i][1];
}
}
list.add(new int[]{start,end});
return list.toArray(new int[list.size()][]);
}
}
🎈不足之处,欢迎雅正留言!