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;
    }
}
View Code

 

posted @ 2020-04-16 17:10  ZJPang  阅读(126)  评论(0编辑  收藏  举报