【LeetCode】No.56. Merge Intervals -- Java Version

54 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情.

题目链接: leetcode.com/problems/me…

1. 题目介绍(Merge Intervals)

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

【Translate】: 给定一个区间数组,其中interval [i] = [starti, endi],合并所有重叠区间,并返回一个非重叠区间数组,该数组覆盖输入中的所有区间。

【测试用例】: testcase

【约束】:

Constraints

2. 题解

原题解来自于shxvam在abhi9720的Java || simple Steps explained || simple sort下的评论。首先通过比较器先来对intervals进行排序,排序策略为:若第一个元素相等,则按照第二个元素进行升序排序,如果不相等,则按照第一个元素升序排序。之后开始遍历intervals数组,比较元素左边界是否小于等于前一个元素的右边界,元素的右边界又是否大于前一个元素的右边界,如果是,则更换记录中的右边界。如果不满足第一个条件,则说明该元素暂时和前面的元素没有交集,那么先存储到列表中,等待查看后面的元素与其是否存在交集。

class Solution {
    public int[][] merge(int[][] intervals) {
        
        Arrays.sort(intervals, new MySort());
        List<int[]> ans = new ArrayList<>();
        ans.add(intervals[0]);
        int index = 0;

        for(int i=1;i<intervals.length;i++){
            if(intervals[i][0]<=ans.get(index)[1]){ //merge
                if(intervals[i][1]>ans.get(index)[1])  //pick end
                    ans.get(index)[1] = intervals[i][1];
                continue;
            }
            ans.add(intervals[i]);
            index++;   
        }

      int arr[][] =  new int[ans.size()][2];  // list to int[][]
       for(int i=0; i<ans.size(); i++){
           arr[i][0] = ans.get(i)[0];
           arr[i][1] = ans.get(i)[1];
       }

       return arr;
    }
}

class MySort implements Comparator<int[]>{  //comparator
    public int compare(int[] a, int[] b){
        if (a[0] == b[0]) return a[1]-b[1];
        else return a[0]-b[0];
    }
}

在这里插入图片描述