题目
题解一:排序
思路:
1、对数组按第一个元素大小进行排序,使得数组按大小连续排列
2、先将第一个数组提前放入list集合,因为肯定是从第一个开始算起的
3、接着对下一个数组的左边界和list集合最后一个元素的右边界对比,如果下一个数组的左边界小于等于list集合最后一个元素的右边界,说明有重叠,这样更新list集合最后一个元素的右边界,取两者右边界的最大值作为右边界
4、若下一个数组的左边界大于等于list集合最后一个元素的右边界,说明没有重合,则直接加入到list集合
public int[][] merge(int[][] intervals) {
if (intervals.length==0) {
return new int[0][2];
}
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]-o2[0];
}
});
List<int[]> list = new ArrayList<>();
list.add(intervals[0]);//提前把第一个存进去
for (int i = 1; i < intervals.length; i++) {//判断边界条件是否满足合并数组的要求
// int[] num = list.get(list.size() - 1);//取出list集合最后一个数组
if (list.get(list.size() - 1)[1]>=intervals[i][0]) { //若list集合最后一个数组右边界大于等于 后面数组的左边界,则需要合并数组
list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1],intervals[i][1]);//取右边界最大的那一个数左右合并数组的右边界;
}else {//不满足合并数组的要求,直接加入list集合,作为list集合最后一个数组
list.add(intervals[i]);
}
}
return list.toArray(new int[list.size()][]);
}
参考链接:贪心算法,合并区间有细节!LeetCode:56.合并区间