leetcode 738.單調遞增的數字
阿新 • • 發佈:2018-05-13
bsp 簡便 style 一個 循環 pan 情況 return bool
給定一個非負整數 N
,找出小於或等於 N
的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x
和 y
滿足 x <= y
時,我們稱這個整數是單調遞增的。)
示例 1:
輸入: N = 10 輸出: 9
示例 2:
輸入: N = 1234 輸出: 1234
示例 3:
輸入: 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<a[i+1], 這種情況下i位之前的數不再滿足遞增的條件。需要按照前面的分析繼續向前查找,直到滿足1或者2的條件
1 class Solution { 2 public: 3 vector<int> getnum(int n){ 4 vector<int> ans; 5 while(n){ 6 ans.push_back(n%10); 7 n /= 10; 8 } 9 return ans; 10 } 11 int monotoneIncreasingDigits(int N) { 12 vector<int> ans = getnum(N);//取得N的每一位數 13 bool flag = true; 14 int i; 15 for(i=ans.size()-1; i>=1; i--){ 16 if(ans[i]>ans[i-1]){17 flag = false; 18 break; 19 } 20 } 21 if(flag) return N;//N本身就是遞增的,直接返回 22 if(i==ans.size()-1) ans[i]--;//情況1 23 else { 24 int m = i; 25 while(m<ans.size()-1 && ans[m]-ans[m+1]<1){//情況3,直到滿足條件1,或者2就退出 26 ans[m]=9; 27 m++; 28 } 29 ans[m]--;//情況2 30 } 31 for(int k=i-1; k>=0; k--) ans[k]=9;//i位之後的數字全部置為9,保證數字最大 32 int temp=0; 33 for(i = ans.size()-1; i>=0; i--) 34 temp = temp*10 + ans[i]; 35 return temp; 36 } 37 38 };
一些小改進
把上面的情況3在一個循環中解決,小小的精簡了一下代碼
1 class Solution { 2 public: 3 vector<int> getnum(int n){ 4 vector<int> ans; 5 while(n){ 6 ans.push_back(n%10); 7 n /= 10; 8 } 9 return ans; 10 } 11 int monotoneIncreasingDigits(int N) { 12 vector<int> ans = getnum(N); 13 int begin=-1, temp=0; 14 for(int i=0; i<ans.size()-1; i++){ 15 if(ans[i]<ans[i+1]){ 16 ans[i+1] = ans[i+1]-1; 17 begin = i; 18 } 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]; 23 return temp; 24 } 25 };
這種問題,把N轉換成字符串是最為簡便的,不用去單獨獲取N的每一位數。
leetcode 738.單調遞增的數字