代码随想录算法训练营第三十一天 |贪心算法part05
56 合并区间
思路:题目的意思是给一个列表,列表里面有很多区间,如果区间内有重合,就进行合并区间。
还是比较上一个的最右边和这一个的最左边。如果小于等于,说明区间有重合,那么当前的左边界变成上一个的左边界,当前的右边界换成两个右边界的最大值,并将上一个设置成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 单调递增的数字
思路:暴力法,时间复杂度肯定不行
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)))