• 0056合并区间 Marathon


    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

    示例 1:

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

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

    提示:

    1 <= intervals.length <= 104
    intervals[i].length == 2
    0 <= starti <= endi <= 104

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/merge-intervals

    参考:

    python

    # 0056.合并区间
    
    class Solution:
        def merge(self, intervals: [[int]]) -> [[int]]:
            """
            按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,
            这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。
            按照左边界从小到大排序之后,如果 intervals[i][0] < intervals[i - 1][1]
            即intervals[i]左边界 < intervals[i - 1]右边界,则一定有重复,
            因为intervals[i]的左边界一定是大于等于intervals[i - 1]的左边界。
            即:intervals[i]的左边界在intervals[i - 1]左边界和右边界的范围内,那么一定有重复!
            :param intervals:
            :return:
            """
            if len(intervals) == 0: return intervals
            intervals.sort(key=lambda x: x[0])
            res = []
            res.append(intervals[0]) # 初始化加入首个区间
            for i in range(1, len(intervals)):
                last = res[-1] # 尾部区间
                if last[1] >= intervals[i][0]: # 右边界>=当前元素的左边界
                    res[-1] = [last[0], max(last[1], intervals[i][1])] # 更新res尾部区间的右边界
                else:
                    res.append(intervals[i]) # 如果区间不交叉,直接append
    
            return res
    

    golang

    package greedy
    
    import "sort"
    
    func merge(intervals [][]int) [][]int {
    	sort.Slice(intervals, func(i, j int) bool {
    		return intervals[i][0]<intervals[j][0]
    	})
    	// 直接处理intervals
    	for i:=0;i<len(intervals)-1;i++ {
    		if intervals[i][1] >= intervals[i+1][0] {
    			intervals[i][1] = max(intervals[i][1], intervals[i+1][1]) // 赋值大值
    			intervals = append(intervals[:i+1], intervals[i+2:]...)
    			i-- // 相当于压缩区间
    		}
    	}
    	return intervals
    }
    
    func max(a,b int) int {
    	if a > b {
    		return a
    	}
    	return b
    }
    
  • 相关阅读:
    对Android开发者有益的40条优化建议
    git推送tag到远端服务器
    详细注释!二维码条码扫描源码,使用Zxing core2.3
    探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
    android的logcat详细用法!
    【Android】开源项目汇总-备用
    android 中theme.xml与style.xml的区别
    Android实现对HOME键的捕获和屏蔽
    java中newInstance()和new()
    java Stack
  • 原文地址:https://www.cnblogs.com/davis12/p/15609749.html
Copyright © 2020-2023  润新知