Day 35 代码随想录 贪心算法 第五天


无重叠区间

   题目链接:无重叠区间
在这里插入图片描述

 
  就是保持右边界不变,然后慢慢移除。

class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        intervals.sort(key=lambda x:x[0])
        #第一个天生不需要移除
        count=1
        #更新右边界
        right=intervals[0][1]
        n=len(intervals)
        for i in range(1,n):
            if intervals[i][0]>=right:
                count+=1
                right=intervals[i][1]
            else:
                right=min(right,intervals[i][1])
        return n-count

56. 合并区间

   题目链接:56. 合并区间
在这里插入图片描述

 
思路

  1. 按照左边的排列,所以左区间一定是最小边界
  2. 将第一个数输入,然后比较,接下来的数字,右边界为最大值。
  3. 没有重合即加入数组
class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        if len(intervals) == 0: return intervals
        intervals.sort(key=lambda x: x[0])
        result = []
        result.append(intervals[0])
        for i in range(1, len(intervals)):
            last = result[-1]
            if last[1] >= intervals[i][0]:
                result[-1] = [last[0], max(last[1], intervals[i][1])]
            else:
                result.append(intervals[i])
        return result

763. 划分字母区间

   题目链接:763. 划分字母区间
在这里插入图片描述

 
思路
本题目的关键就是首位不重复

  1. 用字典记录字母最后一个出现的位置
  2. 然后遍历,不断更新最后出现的位置,当i等于最后出现的位置时就是分割点。
 class Solution(object):
    def partitionLabels(self, s):
        """
        :type s: str
        :rtype: List[int]
        """
        ans=[]
        dic={}
        last_piece = -1 #上一段字符最后出现位置
        end_piece = 0 #当前段字符最后出现位置
        #记录每个字母最后出现的位置
        for i in range(len(s)):
            dic[s[i]]=i
        for i in range(len(s)):
            if end_piece>=i and end_piece< dic[s[i]]:
                end_piece=dic[s[i]]
                # 如果当前位置i走到end_piece了,那么是一次可能的划分位置,
                # 判断当前字符在字典中的位置是不是小于end_piece
            if i == end_piece :
                ans.append(end_piece - last_piece)
                last_piece = end_piece
                end_piece += 1
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值