代码随想录 Day-35|#435 无重叠区间 |#763 划分字母区间 |#56 合并区间

清单

● 435. 无重叠区间
● 763. 划分字母区间
● 56. 合并区间

LeetCode #435 无重叠区间

1. 题目

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠

2. 思路

对数组按照左边界升序进行排序,遍历数组,若当前元素的右边界大于下一元素左边界,则重叠数量+1,更新最小右边界。

3. 代码实现

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

LeetCode #763 划分字母区间

1. 题目

给你一个字符串 s。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。
注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。
返回一个表示每个字符串片段的长度的列表。

2. 思路

初始思路:
根据实例,分割点为相同字母出现的最远距离处,因此需要一个字典用于记录每个字母的最远出现角标。再次遍历字符串,当遍历到的元素等同于开始元素时,记录角标至结果数组中,更新start角标,继续遍历,循环直到遍历结束

3. 代码实现

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        dic = {}
        for i,char in enumerate(s):
            dic[char] = i #如果出现相同char情况,新i值会覆盖旧i,确保字典内为最远char脚标
        
        start = 0
        end = 0
        nums = []
        for i,char in enumerate(s):
            end = max(dic[char], end)
            if i == end:
                nums.append(end - start + 1) #统计切割位置脚标
                start = end + 1 #更新下一次切割的初始脚标
        return nums

LeetCode #56 合并区间

1. 题目

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

2. 思路

对intervals数组按照左边界进行排序,增添一个数组用于记录不重叠的区间数组。遍历intervals数组,当满足遍历元素的左边界小于result数组最新元素的右边界时,即存在重叠区间,更新result最新元素的右边界。若不重叠则直接添加当前intervals元素至result数组中。

3. 代码实现

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        result = []
        intervals.sort(key = lambda x:x[0])
        result.append(intervals[0])
        for i in range(1,len(intervals)):
            if result[-1][1] >= intervals[i][0]:
                result[-1][1] = max(intervals[i][1],result[-1][1])
            else:
                result.append(intervals[i])
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值