[算法基础] 区间合并-合并区间

题目

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题思路

合并区间问题中,我们同样也可以使用双指针进行解题。
对边界进行排序,设置两个指针,一个指针savePoint=0用以存储数据,一个指针scanPoint=1用以扫描。
考虑以下三种情况

  • [1,3],[4,6],不做合并
  • [1,4],[2,3],合并为[1,4]
  • [1,4],[3,6],创建新数组
	/**
	 * @param {number[][]} intervals
	 * @return {number[][]}
	 */
	var merge = function(intervals) {
		// 排序
	    var arr=intervals.sort((a,b)=>a[0]-b[0]);
	    var savePoint=0;scanPoint=1;
	    var res=[];
	    if(intervals.length===1) return [intervals[0]];
	    while(scanPoint<arr.length){
	    	// 第一种情况,两者非包含但连续
	        if(arr[savePoint][1]<arr[scanPoint][0]){
	            res.push(arr[savePoint]);
	        }
	        // 第二种情况,后者被前者包含 替换下一个原数组单元
	        if(arr[savePoint][1]>=arr[scanPoint][1]){
	            arr[savePoint+1]=arr[savePoint];
	        }
	        // 第三种情况,两者有重叠部分,构建新数组,替换下一个原数组单元
	        if(arr[savePoint][1]>=arr[scanPoint][0]&&arr[savePoint][1]<arr[scanPoint][1]){
	            var newArr=[arr[savePoint][0],arr[scanPoint][1]];
	            arr[savePoint+1]=newArr;
	        }
	        savePoint++;
	        scanPoint++;
	    }
	    // 如果走到末尾,则将最后一个元素压入
	    if(scanPoint===arr.length){
	        res.push(arr[savePoint]);
	    }
	    return res
	};

你可能感兴趣的:(算法)