第三十六天|贪心算法

今天题还是需要把逻辑弄清楚

56. Merge Intervals

这道题的关键在于如何判断重叠

Way1:

新建一个最终结果的array,每次取array的最后一个[x,y]中的与遍历数组的x去比较,如果前者比后者大,则进行merge,否则直接存入array

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x:x[0])
        res=[]
        for x in intervals:
            if not res or x[0]>res[-1][1]:
                res.append(x)
            else:
                res[-1][1]=max(res[-1][1],x[1])
        return res

763. Partition Labels

这道题的关键在于如果进行分段,基本方法就是利用两次遍历

Way1:

第一次遍历得到每个字母的最后一次出现的时机,第二次遍历判断当前是不是target字母的最后一次出现,如果是则从l到r这一段就是符合要求的一段,算长度并且重置l为i+1

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        dic={}
        for i in range(len(s)):
            dic[s[i]]=i
        res=[]
        right=0
        left=0
        for i in range(len(s)):
            right=max(right,dic[s[i]])
            if i==right:
                res.append(right-left+1)
                left=i+1
        return res

435. Non-overlapping Intervals

这道题相对复杂一些,主要逻辑就是把去重叠变成找端点

Way1:

对[x,y]按照y排序,然后判断有多少个重复,最终答案就是len(interval)-重复数

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

Way2

这种方法是对对[x,y]中的x排序。然后直接求有多少个非重叠。如果每次是重叠的则当前的y等于当前的y,否则非重叠+1并且找y的最小值

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值