题目描述
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路
因为每个区间的值,有两个数字组成,我们可以借助两个元素来指向合并区间的首尾,类似指针。因为区间存储在二维数组中,初始两个元素指向第一个区间首尾,随后通过while循环判断,每次向二维数组的下一维移位,同时判断上一个区间末尾是否大于下一区间的开头,如果大于证明两个区间可以合并,否则继续下一行,同时将当前区间记录下来。
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class mergeInterval {
//合并区间
public int[][] merge(int[][] intervals){//acc:6ms 91%
List<int[]> res=new ArrayList<>();
if (intervals==null||intervals.length==0){
return res.toArray(new int[0][]);
}
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
int i=0;
while (i<intervals.length){
int left=intervals[i][0];
int right=intervals[i][1];
while (i<intervals.length-1&&right>=intervals[i+1][0]){
i++;
right=Math.max(right,intervals[i][1]);
}
res.add(new int[]{left,right});
i++;
}
return res.toArray(new int[0][]);
}
public static void main(String[] args) {
mergeInterval test=new mergeInterval();
int[][] intervals={{1,3},{2,6},{8,10},{15,18}};
int[][] res=test.merge(intervals);
System.out.println(res[0][0]+","+res[0][1]);
}
}
总结
本题来源于Leetcode中 归属于排序类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿