[LeetCode] 738. Monotone Increasing Digits 單調遞增數字


 

Given a non-negative integer N, find the largest number that is less than or equal to N with monotone increasing digits.

(Recall that an integer has monotone increasing digits if and only if each pair of adjacent digits x and y satisfy x <= y.)

 

Example 1:

Input: N = 10
Output: 9

 

Example 2:

Input: N = 1234
Output: 1234

 

Example 3:

Input: N = 332
Output: 299

 

Note: N is an integer in the range [0, 10^9].

 

這道題給了一個非負數,讓我們求一個數字小於等於給定數字,且該數字各位上的數字是單調遞增的。先來分析題目中給的幾個例子吧,首先如果是 10 的話,由於1大於0,所以不是單調自增的,那么返回的數就是9。第二個例子是 1234,各位上已經滿足單調自增的條件了,返回原數即可。第三個例子是 332,最后一位2小於之前的3,那么此時將前面位減1,先變成322,再往前看,還是小於前面的3,那么再將前面位減1,就變成了 222,此時 222 不是最大的單調遞增數,可以將后面兩位變成9,於是乎就有了 299,小於給定的 332,符合題意。如果給定的數字是 232,那么就會得到 229,這樣可以發現規律,要找到從后往前遍歷的最后一個值升高的位置,讓前一位減1,並把當前位以及后面的所有位都變成9,就可以得到最大的單調遞增數啦。

用j表示最后一個值升高的位置,具體來說應該是其前一位的值大,初始化為總位數n,然后從后往前遍歷,因為每次要和前一位比較,為防止越界,應遍歷到第二個數停止,如果當前位大於等於前一位,符合單調遞增,直接跳過;否則就將前一位自減1,j賦值為當前位i,循環結束后,從j位到末尾的位數都改為9即可,參見代碼如下:

 

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        string str = to_string(N);
        int n = str.size(), j = n;
        for (int i = n - 1; i > 0; --i) {
            if (str[i] >= str[i - 1]) continue;
            --str[i - 1];
            j = i;
        }        
        for (int i = j; i < n; ++i) {
            str[i] = '9';
        }
        return stoi(str);
    }
};

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/738

 

類似題目:

Remove K Digits

 

參考資料:

https://leetcode.com/problems/monotone-increasing-digits/

https://leetcode.com/problems/monotone-increasing-digits/discuss/109811/Simple-and-very-short-C%2B%2B-solution

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM