1. 程式人生 > 其它 >Leetcode 單調遞增的數字

Leetcode 單調遞增的數字

技術標籤:演算法

Leetecode 單調遞增的數字

題目

給定一個非負整數 N,找出小於或等於 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。

(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)

思路

由於該數的組成是單調遞增的,所以,但我們檢索到一個不單調的數字組合的時候,說明最高位一定比下一位要大。這個處理起來很簡單,我們只需要將最高位減1,其他剩下的數字全變成9,這樣就找到了我們想要的數。

程式碼

class Solution:
    @classmethod
    def monotoneIncreasingDigits
(self, N: int) -> int: nums = list(str(N)) # 轉換成字串 length = len(nums) # 獲取字串長度 begin = 0 # N 是否符合條件 is_result = True max_num = float('-inf') # 負無窮 # 從前往後觀察 for i in range(1, length): num = int(nums[i]) # 裝換成整型 pre_num =
int(nums[i - 1]) # 記錄最大值 if pre_num > max_num: begin = i - 1 max_num = pre_num if pre_num > num: is_result = False break # 如果 N 本身符合條件,直接返回 N if is_result: return N # begin 位置減去 1,後面全部替換為 9
nums[begin] = str(int(nums[begin]) - 1) for i in range(begin + 1, length): nums[i] = '9' return int("".join(nums))

其中,begin是用來記錄前一個數字的位置,如果該數字與下一個數字不構成遞減的關係的話,我們就直接將該數字減1,後面的全部替換成9,實現遞增的情況。

我們維持一個最大值,這個最大值其實就是前面的數的最大值,這個最大值其實只是用來記錄前一個數字的位置資訊的輔助標準,只有後面的數比這個最大值要大,那才是符合遞增的標準,不然就不符合。

當不符合標準的時候,由於我們已經記錄下來了不符合標準的數字的位置資訊。

所以只需要將該位置上的數字的值減1,同時後面所有的數字全賦值成9,那麼,我們的答案就出來了。

PS:程式碼是leetcode上的一個大佬的。