学习资料:https://programmercarl.com/0056.合并区间.html#算法公开课
贪心PART5
over
学习记录:
56.合并区间(也是找重叠区间,但是是跟result[-1]比,只用比右边界;更新result[-1][1]为更大值)
点击查看代码
class Solution(object):
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
"""
# 还是重叠问题,但是有点区别,因为要合并重叠区域
# 先把数组第一个放到新建立的result数组中,然后向后遍历数组,相当于i的左边界与i-1的右边界比较,但是这里的i-1变成了result[-1]。先排序所以当发生重叠时,i-1的左边界一定更小就保持不变,而要比较i-1和i的右边界,选择比较大的值赋给i-1的右边界,就完成了合并工作。
result = []
intervals.sort(key=lambda x:x[0]) # 按左边界排序
if not intervals: # 先处理数组为空的情况
return result
result.append(intervals[0]) # 先把数组第一个元素给result
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
738.单调递增的数字(result, flag;如果左数比右数大,则左数-1,右数及之右都变为9;把数字变成字符串来遍历,结果再变成int)
点击查看代码
class Solution(object):
def monotoneIncreasingDigits(self, n):
"""
:type n: int
:rtype: int
"""
# 思路太妙了
# 1 从个位数数字向前遍历,举例:若十位数数字>个位数数字,不符合递增,把十位数数字-1,个位数数字变为9
# 2 当某个数变为9,记录此数位置为flag,他右边的位置的数字都变成9
strn = str(n)
flag = len(strn)
for i in range(len(strn)-1, 0, -1): # 从右向左遍历
if strn[i]<strn[i-1]: # 左数>右数,不满足递增
flag = i # 记录右数位置,因为等会要把右数变为9
strn = strn[:i-1] + str(int(strn[i-1])-1) + strn[i:] # 改变数字字符串,把左数-1
for i in range(flag, len(strn)): # 把flag以及右部位置的数字都变成9
strn = strn[:i] + '9' + strn[i+1:] # 改变数字字符串
return int(strn)
PS:今天宣讲收获两个杯子,安逸,太忙了,第三题以后看,贪心结束啦
忙的今天是啥天气都没注意到,吃了个减脂餐美味就是不顶饿,超辣的燃面不好吃