代码随想录算法训练营day31| 56. 合并区间 738.单调递增的数字

学习资料:https://programmercarl.com/0056.合并区间.html#算法公开课

贪心PART5
over

学习记录:
56.合并区间(也是找重叠区间,但是是跟result[-1]比,只用比右边界;更新result[-1][1]为更大值)

点击查看代码
class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        # 还是重叠问题,但是有点区别,因为要合并重叠区域
        # 先把数组第一个放到新建立的result数组中,然后向后遍历数组,相当于i的左边界与i-1的右边界比较,但是这里的i-1变成了result[-1]。先排序所以当发生重叠时,i-1的左边界一定更小就保持不变,而要比较i-1和i的右边界,选择比较大的值赋给i-1的右边界,就完成了合并工作。
        result = []
        intervals.sort(key=lambda x:x[0])  # 按左边界排序
        if not intervals:   # 先处理数组为空的情况
            return result
        result.append(intervals[0])  # 先把数组第一个元素给result
        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

738.单调递增的数字(result, flag;如果左数比右数大,则左数-1,右数及之右都变为9;把数字变成字符串来遍历,结果再变成int)

点击查看代码
class Solution(object):
    def monotoneIncreasingDigits(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 思路太妙了
        # 1 从个位数数字向前遍历,举例:若十位数数字>个位数数字,不符合递增,把十位数数字-1,个位数数字变为9
        # 2 当某个数变为9,记录此数位置为flag,他右边的位置的数字都变成9

        strn = str(n)
        flag = len(strn)

        for i in range(len(strn)-1, 0, -1):  # 从右向左遍历
            if strn[i]<strn[i-1]:            # 左数>右数,不满足递增
                flag = i                     # 记录右数位置,因为等会要把右数变为9
                strn = strn[:i-1] + str(int(strn[i-1])-1) + strn[i:]  # 改变数字字符串,把左数-1
        
        for i in range(flag, len(strn)):  # 把flag以及右部位置的数字都变成9
            strn = strn[:i] + '9' + strn[i+1:]   # 改变数字字符串
        
        return int(strn)    

PS:今天宣讲收获两个杯子,安逸,太忙了,第三题以后看,贪心结束啦
忙的今天是啥天气都没注意到,吃了个减脂餐美味就是不顶饿,超辣的燃面不好吃

posted @   Tristan241001  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示