代码随想录算法训练营第35天

69 阅读2分钟

56.合并区间

也是一道重叠区间的问题,解决的大概思路就是先排序,按照左边界或右边界都可以;按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重叠,所以是<=)

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

738.单调递增的数字

刚开始想的就是暴力算法,但是很明显会超时

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        if self.judge(n) is True:
            return n
        while self.judge(n) is not True:
            n-=1
        return n

    def judge(self,n):
        str_n=str(n)
        for num in range(1,len(str_n)):
            if str_n[num-1]>str_n[num]:
                return False
        return True

所以在这里要根据题目的要求(单调递增)来知道:以两位数98举例:一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
然后要想的事情是向后遍历还是向前遍历。对本题来说,向前遍历更合适,因为如果数字是三位数以上的数字,向前遍历可以利用上次遍历的结果。

class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        # 将整数转换为字符串
        strNum = list(str(n))

        # 从右往左遍历字符串
        for i in range(len(strNum) - 1, 0, -1):
            # 如果当前字符比前一个字符小,说明需要修改前一个字符
            if strNum[i - 1] > strNum[i]:
                strNum[i - 1] = str(int(strNum[i - 1]) - 1)  # 将前一个字符减1
                # 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质
                for j in range(i, len(strNum)):
                    strNum[j] = '9'

        # 将列表转换为字符串,并将字符串转换为整数并返回
        return int(''.join(strNum))

968.监控二叉树(华为机试第二题)

-----------------------------2025.5.18
没想到在这里遇到了...后悔刷题刷的晚了,二刷再做吧