看到題目就想到了應該使用貪心,但是怎麼貪心卻不是很容易構思,分析一下題意,要找的是小於n的最大的數,並且這個數滿足從最高位到最低為非嚴格遞增(x <= y叫做非嚴格遞增),因為數字要求滿足的性質是對數的每一位的要求,所以考慮按照從每一位來構造。因為9是一位數字的最大值,所以如果從某一位向後全是9,在他之前的數字不可能大於9,所以考慮找到盡可能靠前的某一位,在他之後全填9,那麼這樣的位怎麼找呢?
性質考慮這樣的乙個性質,a數高位如果大於b數,那麼即使a的低位數字小,a也是大於b數的,基於這樣的乙個性質,加上結果的數字最高位是最小的數字,並且小於n,所以,如果n的最高位開始有一部分滿足非嚴格遞增,那麼答案數字的同位和n取相同的數,顯然,所得到的一定是大於其他任何合法的情況的,所以演算法就得到了
演算法從n的最高位開始,如果有一部分滿足非嚴格遞增,那麼答案這幾位和n取相同的值,如果找到了邊界之後,分界點上的數字減一,後面全部寫9,就是最大的,但有乙個邊界情況需要考慮,如果分界點的數字和它之前的相等,那麼減一之後會出現不滿足非嚴格遞增的情況,需要向前遞推找到第乙個等於該分界點的數字,然後減一,後面在全部寫9即可
**
class solution
idx = i - 1;
if (i == strn.size()) return n;
while (idx >= 0 && strn[idx] == strn[idx - 1]) idx--;
string str = strn.substr(0, idx);
str += strn[idx] - 1;
for (int i = idx + 1; i < strn.size(); i ++ ) str += '9';
return stoi(str);
}};
leetcode 738 單調遞增的數字
描述 給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n...
leetCode 738 單調遞增的數字
給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10輸出 9示例 2 輸入 n 1234 輸出 1234示例 3 輸入 n 332輸出...
LeetCode 738 單調遞增的數字
給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n 33...