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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/5/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《每日一题》738. Monotone Increasing Digits 单调递增的数字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

給定一個非負整數(shù)?N,找出小于或等于?N?的最大的整數(shù),同時這個整數(shù)需要滿足其各個位數(shù)上的數(shù)字是單調(diào)遞增。

(當(dāng)且僅當(dāng)每個相鄰位數(shù)上的數(shù)字?x?和?y?滿足?x <= y?時,我們稱這個整數(shù)是單調(diào)遞增的。)

示例 1:

輸入: N = 10 輸出: 9

示例 2:

輸入: N = 1234 輸出: 1234

示例 3:

輸入: N = 332 輸出: 299

說明: N?是在?[0, 10^9]?范圍內(nèi)的一個整數(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)是按位單調(diào)遞增的,那么最大的數(shù)字即為 N。

記 strN[i] 表示數(shù)字 N 從高到低的第 i 位的數(shù)字(i 從 0 開始)。

如果找到第一個位置 iii 使得 [0,i?1][0,i-1][0,i?1] 的數(shù)位單調(diào)遞增且 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 的對應(yīng)數(shù)位相等,仍然被 NNN 限制著,即我們不能隨意填寫 [i+1,n?1][i+1,n-1][i+1,n?1] 位置上的數(shù)字。為了得到最大的數(shù)字,我們需要解除 NNN 的限制,來讓剩余的低位全部變成 999 ,即能得到小于 NNN 的最大整數(shù)。而從貪心的角度考慮,我們需要盡量讓高位與 NNN 的對應(yīng)數(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 即可。

但這里存在一個問題:當(dāng) 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] 不再滿足遞增的關(guān)系,因此我們需要從 i?1i-1i?1 開始遞減比較相鄰數(shù)位的關(guān)系,直到找到第一個位置 jjj 使得 strN[j]\textit{strN}[j]strN[j] 自身數(shù)位減 111strN[j?1]\textit{strN}[j-1]strN[j?1]strN[j]\textit{strN}[j]strN[j] 仍然保持遞增關(guān)系,或者位置 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))

復(fù)雜度分析

  • 時間復(fù)雜度: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) 的時間即能構(gòu)造出滿足條件的數(shù)字。

  • 空間復(fù)雜度:O(log?N)O(\log N)O(logN)。我們需要 O(log?N)O(\log N)O(logN) 的空間存放數(shù)字 NNN 每一位的數(shù)字大小。

總結(jié)

以上是生活随笔為你收集整理的《每日一题》738. Monotone Increasing Digits 单调递增的数字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。