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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

738. 单调递增的数字(贪心算法)

發布時間:2025/3/21 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 738. 单调递增的数字(贪心算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個非負整數 N,找出小于或等于 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)

示例 1:
輸入: N = 10
輸出: 9

示例 2:
輸入: N = 1234
輸出: 1234

示例 3:
輸入: N = 332
輸出: 299
————————————————————————————————————————————————————————
這道題貪心算法思路就是:
局部最優:遇到strNum[i - 1] > strNum[i]的情況,讓strNum[i - 1]–,然后strNum[i]給為9,保證變成最大單調遞增
全局最優:得到小于等于n的最大單調遞增函數

這里需要注意,遍歷要從個位開始,即從后向前遍歷,
還有這里str[i]變成9需要單獨整體操作,所以需要一個flag來標記9是從哪開始的
開始我就踩了這個坑,代碼是

class Solution { public:int monotoneIncreasingDigits(int n) {string strNum = to_string(n);for (int i = strNum.size() - 1; i > 0; --i) {if (strNum[i - 1] > strNum[i]) {strNum[i] = '9';strNum[i - 1]--;}}return stoi(strNum);} };

這樣就會在一些情況下出問題,如n為100時會輸出90,而實際上我們需要的是99;
正確代碼如下:

class Solution { public:int monotoneIncreasingDigits(int n) {string strNum = to_string(n);//這個初始化是防止第一個for循環沒有執行的情況int flag = strNum.size();for (int i = strNum.size() - 1; i > 0; --i) {if (strNum[i - 1] > strNum[i]) {flag = i;strNum[i - 1]--;}}for (int i = flag; i < strNum.size(); ++i) {strNum[i] = '9';}return stoi(strNum);} };

總結

以上是生活随笔為你收集整理的738. 单调递增的数字(贪心算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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