Leecode 56

在这里插入图片描述
题目解析:
先对若干个区间排序,那么所有区间的起始值必然是从小到大的,而只要保证当前每一步的结束值是最大的就行了。这时候就要用到贪心算法,依次遍历每一个区间,当前一时刻的结束值大于等于当前区间的起始值时,则比较前一时刻的结束值与当前区间的结束值,保存最大的结束值,并标记从这一区间开始已经重叠了,而当前一时刻的结束值小于当前区间的起始值时,则根据是否重叠区间,将前一时刻的起始值和结束值保存下来。

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        flag = 0
        intervals.append([100000, 100000])  # 因为是从下标1开始,需添加一个很大的区间,这样就省去了边界条件
        intervals.sort()   # 排序,使得区间的起始值递增,则只需记录结束值
        L = []
        end = intervals[0][1]  #  记下第一个区间的结束值
        for i in range(1, len(intervals)):
            if end >= intervals[i][0]:  # 如果上一时刻与当前区间有重叠,(注意这里的上一时刻指的是当前区间前面的所有区间,则记下上一时刻的起始值(最开始产生重叠的起始值)),则保存当前区间的结束值与上一时刻的结束值最大的那一个
                if flag == 0:   # 标记是否产生重叠
                    start = intervals[i-1][0]
                    flag = 1
                end = max(end, intervals[i][1])
            else:  # 上一时刻与当前时刻并未产生重叠
                if flag == 0:   # 并且之前也并未重叠,则直接保存上一区间
                    start, end = intervals[i-1][0], intervals[i-1][1]
                    L.append([start, end])
                else:   # 之前发生了重叠,保存最终重叠区间
                    L.append([start, end])
                    flag = 0
                end = intervals[i][1]  # 结束值从当前区间重新开始
        return L
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值