参考文献 代码随想录
一、合并区间
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
class Solution(object): def merge(self, intervals): """ :type intervals: List[List[int]] :rtype: List[List[int]] """ if len(intervals) == 0: return result # 区间集合为空直接返回 intervals.sort(key = lambda x: x[0]) result = [] result.append(intervals[0]) 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
二、单调递增的数字
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
问题分析:由题意可知,所求的数字是单调递增,并且是最大的,所以我们该如何保证它是升序的?例如32,个位只能取到[0, 1, 2]所以这个数字还是降序,所以,我们只能将十位,然后个位取到最大的值,然后那该如何遍历呢?(我们是2个2个的比较)从前还是从后呢?答案是从后,例如221,如果是从前,则前面2个是满足的,所以遍历到21的时候不满足,所以要需改,那么修改后的结果为19,则最后结果是219,显然是不满足的,那么从后往前遍历,则21不满足,则会变成19,然后此时的结果为219,然后到21,则处理后的结果为19,最后的结果就位199.
class Solution(object): def monotoneIncreasingDigits(self, n): """ :type n: int :rtype: int """ strN = list(str(n)) for i in range(len(strN) -1 , 0, -1): if strN[i] < strN[i - 1]: # 当前的这个数比前面的小, 就把前面的元素减1,后面的元素取9 strN[i - 1] = str(int(strN[i - 1]) - 1) strN[i:] = "9" * (len(strN) - i) # 有几个前面的元素改变了, return int(''.join(strN))
总结:贪心没有套路,只能靠自己!!!