代码随想录27期|Python|Day35|435. 无重叠区间|763.划分字母区间|56. 合并区间

 435. 无重叠区间

和昨天的射爆气球是一样的处理方式:

由于不需要进行不重合的时候的计算,只需要对重合进行处理,所以反而更加简单。

1、按照区间左边界从小到大排序;

2、从索引1开始遍历,对于i-1的右边界大于i的左边界的情况,记录一次重合,并且修改i的右边界是i和i-1的最小值。

(需要注意lambda取出元组的方式和遍历的时候判断的边界)

class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        intervals.sort(key=lambda x: x[0])
        res = 0
        for i in range(1, len(intervals)):
            if intervals[i-1][1] > intervals[i][0]:
                res += 1
                intervals[i][1] = min(intervals[i-1][1], intervals[i][1])
        return res

 763.划分字母区间 

本题也是判断区间边界的一道题。

1、首先第一次遍历获取每个字母对应的最远距离;

2、第二次遍历不断更新右边界为当前遍历到的字母最远距离的最大值;

3、在遍历到右边界的时候,保存区间的长度,更新左边界。

class Solution(object):
    def partitionLabels(self, s):
        """
        :type s: str
        :rtype: List[int]
        """
        far_reach = {}  # 创建哈希表用来储存每个字母对应的最远的距离
        # 第一次遍历,获取每个字母对应的最远的距离
        for i, char in enumerate(s):
            far_reach[char] = i
        res = []
        left, right = 0, 0  # 声明左右边界,用来计算区间长度
        # 第二次遍历,不断更新右边界的值,如果遍历到了右边界,储存区间长度
        for i, char in enumerate(s):
            right = max(right, far_reach[char])
            if i == right:
                res.append(right - left + 1)
                left = i + 1
        return res

需要注意使用right和left双指针计算区间长度的方法,以及更新右边界的时候是取最大值。

 56. 合并区间

关键在于对于重合区间的处理,这里采用的是类似栈的方法,每次仅修改栈最后一个位置的右端点。

1、按照区间左边界从小到大排序;

2、先将第一个区间入栈;

3、遍历每一个区间:

        1,如果重合,直接修改入栈的最后一个区间的右端点为右边界的最大值;

        2,如果不重合,直接入栈。

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        intervals.sort(key=lambda x: x[0])
        res = []
        res.append(intervals[0])  # 储存第一个区间
        for i in range(1, len(intervals)):
            if res[-1][1] >= intervals[i][0]:
                res[-1][1] = max(intervals[i][1], res[-1][1])  # 直接修改保存好的区间的右端点
            else:
                res.append(intervals[i])  # 不重合直接添加
        return res

第35天完结!!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值