Description:
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considered overlapping.
Solution:
这道题要求将输入的数组序列中相互重叠的部分合并
对于这道题,我们需要思考,什么情况下数组序列会相互重叠呢?
如题目中所给的例1,[1,3] & [2,6] 就发生了重叠,重叠的条件即为前一个数组的第二个值大于或等于后一个数组的第一个值。
依靠这一判断条件,当发生重叠时,输入前一个数组的第一个值与后一个数组的第二个值,即可完成了合并的操作。
但是,这里有一个小陷阱,如果出现例如[1,5] & [2,4] 这样的情况,单纯的按刚才的思路就输出了错误的结果。
解决方法可以为每次比较第二个值的大小,将较大的那一位输出;还有一个方法是直接取出所有数组的首位与末位,将其排序,然后在按上面的方法输出,即避免了上例中的情况。
Code:
public List<Interval> merge(List<Interval> intervals) {
int n = intervals.size();
if (n <= 1){
return intervals;
}
int[] start = new int[n];
int[] end = new int[n];
for (int i = 0; i < n; i++){
start[i] = intervals.get(i).start;
end[i] = intervals.get(i).end;
}
Arrays.sort(start);
Arrays.sort(end);
List<Interval> res = new ArrayList<>();
for(int i = 0, j = 0; i < n; i ++){
if (i == n - 1 || start[i+1] > end[i]){
res.add(new Interval(start[j], end[i]));
j = i+1;
}
}
return res;
}
提交情况:
Runtime:
2 ms, faster than 100.00% of Java online submissions for Merge Intervals.
Memory Usage:
41.1 MB, less than 87.51% of Java online submissions for Merge Intervals.