日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《每日一题》738. Monotone Increasing Digits 单调递增的数字

發布時間:2024/5/17 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《每日一题》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] 自身數位減 111strN[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 单调递增的数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。