【代码随想录算法训练营】第36天 | 第八章 贪心(五)+ 复习第7天 第三章 哈希表(二)

主要内容

重叠区间问题

贪心题目

435. 无重叠区间

思路分析

按照右区间从小到大排序(给下一个区间留更多的空间),从左向右找不相交区间的个数

代码

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        # 按照右边界从小到达排序,从左到右记录非交叉区间的个数,
        # 总区间个数减去非交叉区间极为要移除的区间
        intervals.sort(key = lambda x : x[1])
        n = len(intervals)
        if n == 0:
            return 0
        # 记录非交叉区间的个数
        count = 1
        # 记录区间分割点
        end = intervals[0][1]
        for i in range(1,n):
            if intervals[i][0] >= end:
                end = intervals[i][1]
                count += 1
        return n - count

763.划分字母区间

思路分析

想法1:
首先遍历一遍字符串统计字母出现的次数
再遍历字符串,记录当前遍历到的集合元素,若达到count为0,则移除,若l为空,则记录到结果中

想法2:
记录每个字符出现的最远边界
再一次的遍历中,更新遇到的字符的最远边界的最大值,达到最大值则记录进结果

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        res = []
        # 统计字母出现的次数
        count = [0] * 26
        for c in s:
            count[ord(c)-ord('a')] += 1
        # 记录当前遍历到的集合元素,若达到count为0,则移除
        l = []
        start = 0
        for i, c in enumerate(s):
            if c not in l:
                l.append(c)
            count[ord(c)-ord('a')] -= 1
            if count[ord(c)-ord('a')] == 0:
                l.remove(c)
            if len(l) == 0:
                res.append(i - start + 1)
                start = i + 1
        return res
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        res = []
        # 统计字母出现的最远位置
        h = [0] * 26
        for i in range(len(s)):
            h[ord(s[i])-ord('a')] = i

        left = 0
        right = 0
        for i in range(len(s)):
            # 更新遍历过的字符的最远边界
            right = max(right, h[ord(s[i])-ord('a')])
            if i == right:
                res.append(right - left + 1)
                left = i + 1
        return res

56. 合并区间

思路分析

按左端点从小到大排序
找到结果集的最后一个区间,若当前区间与其重合,则合并,不重合则加入结果集

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # 按左端点从小到大排序,次序为右端点从小到大,若和下一个重合,则更新右端点
        res = []
        intervals.sort(key=lambda x : (x[0], x[1]))
        start = intervals[0][0]
        end = intervals[0][1]
        for i in range(1,len(intervals)):
            if intervals[i][0] <= end:
                end = max(end, intervals[i][1])
            else:
                res.append([start, end])
                start = intervals[i][0]
                end = intervals[i][1]
        res.append([start, end])
        return res

思路清晰

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        # 按左端点从小到大排序
        # 找到结果集的最后一个区间,若当前区间与其重合,则合并,不重合则加入结果集
        res = []
        intervals.sort(key=lambda x : x[0])
        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])]
            else:
                res.append(intervals[i])
        return res

哈希题目

哈希题目

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值