給定乙個非負整數n
,找出小於或等於n
的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字x
和y
滿足x <= y
時,我們稱這個整數是單調遞增的。)
示例 1:
輸入: n = 10示例 2:輸出: 9
輸入: n = 1234示例 3:輸出: 1234
輸入: n = 332說明:輸出: 299
n
是在[0, 10^9]
範圍內的乙個整數。
題目要求:找到不大於n的數, 這個數要求從高位到地位是遞增的
思路:從高位找到第一位不滿足要求的數,將其位置記為i,把i位的數字減小1, 且i位之後的數字要均為9,才能保證數字最大。 此外還要保證修改i位的數字後,要保證i之前的數字均保證滿足遞增的要求;就有一下幾種情況
i是最高位,將其減一即可
i不是最高位,且a[i]-a[i+1]>=1, 直接把a[i]-1, 這種情況下依然滿足遞增的條件
i不是最高位,且a[i]-a[i+1]<1, 此時a[i]-1
1class
solution
9return
ans;10}
11int monotoneincreasingdigits(int
n) 20}21
if(flag) return
n;//n本身就是遞增的,直接返回
22if(i==ans.size()-1) ans[i]--;//情況1
23else
29 ans[m]--;//情況230}
31for(int k=i-1; k>=0; k--) ans[k]=9
;//i位之後的數字全部置為9,保證數字最大
32int temp=0;33
for(i = ans.size()-1; i>=0; i--)
34 temp = temp*10 +ans[i];
35return
temp;36}
3738 };
一些小改進
把上面的情況3在乙個迴圈中解決,小小的精簡了一下**
1class
solution
9return
ans;10}
11int monotoneincreasingdigits(int
n) 19}20
for(int k=begin; k>=0; k--) ans[k]=9;21
for(int i = ans.size()-1; i>=0; i--)
22 temp = temp*10 +ans[i];
23return
temp;
24}
25 };
這種問題,把n轉換成字串是最為簡便的,不用去單獨獲取n的每一位數。
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...