程式碼隨想錄演算法訓練營day31| 56. 合併區間 738.單調遞增的數字

Tristan241001發表於2024-10-30

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

相關文章