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