开启掘金成长之旅!这是我参与「掘金日新计划 · 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],合并所有重叠区间,并返回一个非重叠区间数组,该数组覆盖输入中的所有区间。
【测试用例】:
【约束】:
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];
}
}