學習資料: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:今天宣講收穫兩個杯子,安逸,太忙了,第三題以後看,貪心結束啦
忙的今天是啥天氣都沒注意到,吃了個減脂餐美味就是不頂餓,超辣的燃面不好吃