《每日一题》738. Monotone Increasing Digits 单调递增的数字
給定一個非負整數?N,找出小于或等于?N?的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字?x?和?y?滿足?x <= y?時,我們稱這個整數是單調遞增的。)
示例 1:
輸入: N = 10 輸出: 9示例 2:
輸入: N = 1234 輸出: 1234示例 3:
輸入: N = 332 輸出: 299說明: N?是在?[0, 10^9]?范圍內的一個整數。
暴力
邏輯上的判斷沒有什么難的,按常理來說暴力必超時。
Python
class Solution:def monotoneIncreasingDigits(self, N: int) -> int:for num in range(N, -1, -1):if list(str(num)) == sorted(list(str(num))):return num貪心
如果整個數字 N 本身已經是按位單調遞增的,那么最大的數字即為 N。
記 strN[i] 表示數字 N 從高到低的第 i 位的數字(i 從 0 開始)。
如果找到第一個位置 iii 使得 [0,i?1][0,i-1][0,i?1] 的數位單調遞增且 strN[i?1]>strN[i]\textit{strN}[i-1]>\textit{strN}[i]strN[i?1]>strN[i],此時 [0,i][0,i][0,i] 的數位都與 NNN 的對應數位相等,仍然被 NNN 限制著,即我們不能隨意填寫 [i+1,n?1][i+1,n-1][i+1,n?1] 位置上的數字。為了得到最大的數字,我們需要解除 NNN 的限制,來讓剩余的低位全部變成 999 ,即能得到小于 NNN 的最大整數。而從貪心的角度考慮,我們需要盡量讓高位與 NNN 的對應數位相等,故嘗試讓 strN[i?1]\textit{strN}[i-1]strN[i?1] 自身數位減 111。此時已經不再受 NNN 的限制,直接將 [i,n?1][i, n-1][i,n?1] 的位置上的數全部變為 999 即可。
但這里存在一個問題:當 strN[i?1]\textit{strN}[i-1]strN[i?1] 自身數位減 111 后可能會使得 strN[i?1]\textit{strN}[i-1]strN[i?1] 和 strN[i?2]\textit{strN}[i-2]strN[i?2] 不再滿足遞增的關系,因此我們需要從 i?1i-1i?1 開始遞減比較相鄰數位的關系,直到找到第一個位置 jjj 使得 strN[j]\textit{strN}[j]strN[j] 自身數位減 111 后 strN[j?1]\textit{strN}[j-1]strN[j?1] 和 strN[j]\textit{strN}[j]strN[j] 仍然保持遞增關系,或者位置 jjj 已經到最左邊(即 jjj 的值為 000),此時我們將 [j+1,n?1][j+1,n-1][j+1,n?1] 的數全部變為 999 才能得到最終正確的答案。
Python
class Solution:def monotoneIncreasingDigits(self, N: int) -> int:index, strN = 1, list(str(N))while index < len(strN) and strN[index - 1] <= strN[index]:index += 1if index < len(strN):while index > 0 and strN[index - 1] > strN[index]:strN[index - 1] = str(int(strN[index - 1]) - 1)index -= 1for i in range(index + 1, len(strN)):strN[i] = '9'return int("".join(strN))復雜度分析
-
時間復雜度:O(log?N)O(\log N)O(logN),其中 O(log?N)O(\log N)O(logN) 表示數字 NNN 的位數。我們遍歷 O(log?N)O(\log N)O(logN) 的時間即能構造出滿足條件的數字。
-
空間復雜度:O(log?N)O(\log N)O(logN)。我們需要 O(log?N)O(\log N)O(logN) 的空間存放數字 NNN 每一位的數字大小。
總結
以上是生活随笔為你收集整理的《每日一题》738. Monotone Increasing Digits 单调递增的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《每日一题》49. Group Anag
- 下一篇: TypeError: ‘BasePerm