/**
* 自己的代码,思路:
* 先将intervals中的区间按照start从小到大排序(这里快排写起来有一点tricky,要始终记得intervals里的元素是数组,要分别给元素的0和1位置赋值,才能实现元素的赋值)
* 再从左到右扫描,根据前一区间的end和后一区间的start的大小比较,确定是否能合并为一个区间
* Runtime: 2 ms, faster than 99.74%
* Memory Usage: 41.8 MB, less than 42.56%
*/
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> resList = new ArrayList(); // create resList instead of resArray, because of unknown length of resArray
resList.add(intervals[0]); // initiate resList
quickSort(intervals, 0, intervals.length - 1); // sort intervals by the value of start in each interval
// merge intervals
for (int i = 1; i < intervals.length; i++) {
int[] preInterval = resList.get(resList.size() - 1);
if (preInterval[1] >= intervals[i][0]) { // merge into existing interval
preInterval[1] = Math.max(preInterval[1], intervals[i][1]);
} else { // add a new interval
resList.add(intervals[i]);
}
}
// turn resList int resArray
/* can be "return resList.toArray(new int[resList.size()][]);" */
int[][] res = new int[resList.size()][];
for (int i = 0; i < res.length; i++) {
res[i] = resList.get(i);
}
return res;
}
// sort intervals by the value of start in each interval
private void quickSort(int[][] intervals, int start, int end) {
if (start >= end) {
return;
}
int left = start, right = end, mid = (start + end) / 2, pivotStart = intervals[mid][0], pivotEnd = intervals[mid][1];
intervals[mid][0] = intervals[right][0];
intervals[mid][1] = intervals[right][1];
while (left < right) {
while (left < right && intervals[left][0] <= pivotStart) {
left++;
}
intervals[right][0] = intervals[left][0];
intervals[right][1] = intervals[left][1];
while (left < right && intervals[right][0] >= pivotStart) {
right--;
}
intervals[left][0] = intervals[right][0];
intervals[left][1] = intervals[right][1];
}
intervals[left][0] = pivotStart;
intervals[left][1] = pivotEnd;
quickSort(intervals, start, left - 1);
quickSort(intervals, left + 1, end);
}
}
56. Merge Intervals [Medium]
最新推荐文章于 2024-07-12 18:12:33 发布