1. 程式人生 > >leetcode 738.單調遞增的數字

leetcode 738.單調遞增的數字

bsp 簡便 style 一個 循環 pan 情況 return bool

給定一個非負整數 N,找出小於或等於 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。

(當且僅當每個相鄰位數上的數字 xy 滿足 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之前的數字均保證滿足遞增的要求;就有一下幾種情況

  1. i是最高位,將其減一即可
  2. i不是最高位,且a[i]-a[i+1]>=1, 直接把a[i]-1, 這種情況下依然滿足遞增的條件
  3. 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.單調遞增的數字