56. 合并区间
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
提示:
- 1 <= intervals.length <= 104
- intervals[i].length == 2
- 0 <= starti <= endi <= 104
解题思路:
1.以每个区间的首下标为标准对各个区间进行排序,这样可以保证下一次遍历出现的区间只会出现在当前区间的右边,而不用考虑左边的情况;
2.排序后,以上一个区间[start,end]作为参照,考虑当前区间的首尾下标[s,e]:
- 若s在[start,end]区间内,必然可以合并。此时,再比较两个区间的尾下标,谁越远,谁作为新区间的尾坐标;
- 若s在[start,end]区间右边,则表示当前区间与上一个区间无法合并,将上一个区间纳入ans数组,并将更新参照区间为当前区间;
- 无需考虑s在区间左边的情况,因为前面排序就已经确保遍历到的下一个区间的首下标只能等于或大于当前区间首下标;
3.遍历完所有区间后,还要将最后一个参照区间纳入ans数组,算法结束;
var merge = function(intervals) { intervals.sort(function(a,b){return a[0]-b[0]});//以首下标对区间排序 //初始化参考区间 let start = intervals[0][0]; let end = intervals[0][1];
let ans = []; for(let i=1;i<intervals.length;i++){ let s = intervals[i][0]; if(s<=end){ end = Math.max(intervals[i][1],end); continue; } if(s>end){ ans.push([start,end]); start = s; end = intervals[i][1]; } } ans.push([start,end]); return ans; };

浙公网安备 33010602011771号