代码随想录算法训练营第三十一天 |贪心算法part05

112 阅读1分钟

代码随想录算法训练营第三十一天 |贪心算法part05

56 合并区间

image.png

思路:题目的意思是给一个列表,列表里面有很多区间,如果区间内有重合,就进行合并区间。

还是比较上一个的最右边和这一个的最左边。如果小于等于,说明区间有重合,那么当前的左边界变成上一个的左边界,当前的右边界换成两个右边界的最大值,并将上一个设置成None,因为新的区间已经包含了上一个。

    intervals = [[1,3],[2,6],[8,10],[15,18]]
    intervals.sort(key=lambda x:(x[0],x[1]))
    for i in range(1,len(intervals)):
        if intervals[i][0] <= intervals[i-1][1]:
            intervals[i][0] = intervals[i-1][0]
            intervals[i][1] = max(intervals[i][1],intervals[i-1][1])
            intervals[i-1] = None
    intervals = [x for x in intervals if x]
    print(intervals) 

738 单调递增的数字

image.png

思路:暴力法,时间复杂度肯定不行

n = 963856657
s = str(n)
def is_decreasing(s):
    for i in range(1,len(s)):
        if s[i] < s[i-1]:
            return False
    return True
while is_decreasing(s) is False:
    s = str(int(s) - 1)
    if is_decreasing(s):
        print(s)
        break

思路:332->299 1232 -> 1229 所以说找到第一位开始不符合要求的位上的数是x,那么改成x-1,后面的所有数都改成9即可。

332->329->299 从右往左进行遍历

n = 332
strNum = list(str(n))
for i in range(len(strNum)-1,0,-1):
    if strNum[i] < strNum[i-1]:
        strNum[i-1] = str(int(strNum[i-1])-1)
        strNum[i:] = '9'*(len(strNum)-i)
print(int(''.join(strNum)))

968 监控二叉树(可跳过)

image.png