LeetCode 56 aka 每日一题
https://leetcode-cn.com/problems/merge-intervals/
这个合并区间的题比较简单,使用到了Arrays工具包中的sort方法,这次来巩固一下。
对于二维数组的排序,我们可以这么写
Arrays.sort(intervals, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; } });
我们重写了他的比较方法,其中o1-o2是返回升序排列,如果o2-o1的话就是降序排列。
我们将它开始的区间进行排序,以比较前一个区间的结束和当前区间的开始的大小关系。
如果当前区间的start比上一个区间的end小,说明这两个区间可以合成一个,并且把较大的结束位设置为新结束位。
如果比上一个区间的end大,说明这两个区间不存在连续关系。我们将上一个区间的start和end新建一个数组放入list中,然后令新的开始和结束分别为当前的值。
代码如下
class Solution { public int[][] merge(int[][] intervals) { if(intervals == null || intervals.length<1){ return intervals; } Arrays.sort(intervals, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0]-o2[0]; } }); ArrayList<int[]> list = new ArrayList<>(); int end = intervals[0][1]; int start = intervals[0][0]; for(int i =1;i<intervals.length;i++){ if (intervals[i][0] > end) { list.add(new int[]{start, end}); start = intervals[i][0]; } if(end < intervals[i][1]){ end = intervals[i][1]; } } list.add(new int[]{start,end}); int[][] result = new int[list.size()][2]; for(int i = 0 ;i < list.size();i++){ result[i][0] = list.get(i)[0]; result[i][1] = list.get(i)[1]; } return result; } }