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

题目

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

示例 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
	};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值