算法第三十一天:贪心算法part05(第八章)
1.合并区间
56. 合并区间 - 力扣(LeetCode)
思路:
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key=lambda x: x[0])res = [intervals[0]]for i in range(1, len(intervals)):last = res[-1]cur = intervals[i]if cur[0] <= last[1]:#有重叠,更新最后一个区间的右边界last[1] = max(last[1], cur[1])else:res.append(cur)return res
2.单调递增的数字
738. 单调递增的数字 - 力扣(LeetCode)
💡 核心思路(贪心 + 回退 + 置9)
-
从后往前遍历,找出第一个不满足单调递增的位置;
-
将前一个数字减1,因为继续保留这个数字已经违反单调递增;
-
从这个位置开始,后面所有的数字都变为9,以保证得到最大合法结果;
-
最后将处理完的字符串转换为整数输出。
class Solution:def monotoneIncreasingDigits(self, n: int) -> int:#变成字符串就可以不用除法strNum = str(n)flag = len(strNum)#使用后序遍历来做for i in range(len(strNum)-1, 0, -1):if strNum[i-1] > strNum[i]:strNum = strNum[:i-1] + str(int(strNum[i-1])-1) + strNum[i:]flag = ifor i in range(flag, len(strNum)):strNum = strNum[:i]+'9'+strNum[i+1:] #在字符串里 逐个字符 替换成 '9',字符串是 不可变类型(immutable),每次只能生成一个新字符串。return int(strNum)
今天结束啦,终于结束贪心算法啦!!