代码随想录 Day 36 | 【第八章 贪心算法 part 05】56. 合并区间、738.单调递增的数字、968.监控二叉树 (可跳过)、贪心算法总结

一、56. 合并区间

本题也是重叠区间问题,如果昨天三道都吸收的话,本题就容易理解了。

1. 解题思路

(1)首先对区间按照左边界进行排序,方便对重叠区间进行处理。

(2)对重叠的判断:当前区间的左边界小于等于上一个区间的右边界,说明两个区间存在重叠;从而对重叠区间进行合并操作。如果两个区间不重叠,就重新定义一个result数组将区间放入即可。

2. 代码实现

(1)定义一个二维数组用于记录我们最后的结果。

(2)如果输入的区间是空,那么直接返回我们的空result结果。

(3)对输入的区间按照左边界进行排序。将第0个区间先放进结果集,因为至少有一个区间是一定存在的。如果后面的区间有重叠的话,那么直接让区间进行合并,直接在result数组里进行修改。

(4)遍历区间,从1开始。如果当前遍历的区间左边界小于等于上一个区间的右边界(由于前面重叠的已合并,所以也就是区间最后一个位置),此时发现重叠需要进行合并操作。但是由于按照左边界进行排序的,所以左边界无需进行更新,一定是最小的,所以需要更新新区间的右边界。新区间的右边界更新为二者较大值即可。如果没重叠就直接放进result数组即可。

(5)返回result。

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

二、738.单调递增的数字

738.单调递增的数字

代码实现

(1)为方便遍历数字,将传入的int型转化为string型。flag用于将后面的数字全部赋成9,由于为了避免string本身就符合题目条件的情况,那么将其初始化为0最后会将所有位置全赋成9,所以只能初始化为s的长度。

(2)从后向前for循环遍历:如果string的 i-1 小于 i ,那么string[i-1]需要自减1,同时需要将后面的值全部赋成9,但在此处我们用flag标记一下 i ,用于从第i向后全部都赋成9。

(3)接下来,对i后全赋成9进行处理:for循环遍历从i开始的string,全部赋值为9。

(4)由于最后返回int型,那么需要将string转换为int。

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        str_num = str(n)
        flag = len(str_num)
        for i in range(len(str_num)-1, 0, -1):
            if str_num[i] < str_num[i-1]:
                flag = i
                str_num = str_num[:i-1] + str(int(str_num[i-1])-1)+str_num[i:]
        for i in range(flag, len(str_num)):
            str_num = str_num[:i]+'9'+str_num[i+1:]
        return int(str_num)

三、总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值