算法随想录第三十六天打卡|435. 无重叠区间 , 763.划分字母区间 ,56. 合并区间

详细布置  

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 

还是属于那种,做过了也就会了,没做过就很难想出来。

不过大家把如下三题做了之后, 重叠区间 基本上差不多了

 435. 无重叠区间 

代码随想录

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

总结

在做完有重叠区间的题后,再来做这道题就显得要简单一些。把重叠的条件看错了,当相等时是不重叠的。

763.划分字母区间 

代码随想录

思路

我是想的先把他化成像之前那样用开始和结尾的列表,然后只要让它切割的时候不要切到中间的之就行,也就是不重合的时候切一次。

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        nums_start=[-1]*26
        nums_end=[-1]*26
        for i in range(len(s)):
            if nums_start[ord(s[i])-ord('a')]==-1:  #表示它没有出现过
                nums_start[ord(s[i])-ord('a')]=i  #刚出现时的下标
                nums_end[ord(s[i])-ord('a')]=i
            else:
                nums_end[ord(s[i])-ord('a')]=i  #结束时的下标
        nums=[]
        for i in range(26):
            if nums_start[i]!=-1:
                nums.append([nums_start[i],nums_end[i]])
        result=[]
        nums.sort(key=lambda x:(x[0]))
        rightBoard = nums[0][1]  # 记录最大右边界
        leftBoard = 0
        for i in range(1, len(nums)):
            if nums[i][0] > rightBoard:  # 出现分割点
                result.append(rightBoard - leftBoard + 1)
                leftBoard = nums[i][0]
            rightBoard = max(rightBoard, nums[i][1])
        result.append(rightBoard - leftBoard + 1)  # 最右端
        return result

总结

在分割的时候搞错了,答案是用一个数来重新表示最右边的值和最左边的值,我是直接用上一题的方法把它改成最大值,这样导致,其实我也不知道为什么不能这样求。

56. 合并区间  

本题相对来说就比较难了。

代码随想录

思路

我想的是把它重复的区间都删掉,留一个正确的区间就行了,结果删的时候很麻烦,我也不会删,也费空间,所以就想添加,但添加我也不知道思路。

class Solution:
    def merge(self, intervals):
        result = []
        if len(intervals) == 0:
            return 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(result[-1][1], intervals[i][1])
            else:
                result.append(intervals[i]) 
        return result

总结

确实太奇妙了,我本来想的是添加的话还是要考虑删除才能让他继续遍历下去,但这直接添加到结果列表上,用结果列表来进行比较是否为重叠区间,避免了重叠后的继续遍历的问题,最后也是修改的是结果列表。看来删除的操作确实是不常用,下次还是重点考虑添加到新列表的方法。

你可能感兴趣的:(算法)