556. 下一个更大元素 III(贪心)

556. 下一个更大元素 III(贪心)

传送门

思路:维护一个非递增序列,从右往左查找如果该数是一个非递增数列,表示它已经是最大值,否则必有解,但要判断是否是 I N T INT 型。

从左往右找到最后一次出现可以交换的数位,因为它后面的数肯定是非递增数列,所以将它翻转一下变成非递减数列,然后用第一个比它大的数与它交换,这样是最优的。

class Solution {
public:
    vector<int> Change(int n){
         vector<int>a;
         while(n){
             a.push_back(n%10);
             n/=10;
         }
         reverse(a.begin(),a.end());
         return a;
    }
    int nextGreaterElement(int n) {
          vector<int>a=Change(n);
          int l=-1;
          n=a.size();
          for(int i=1;i<n;i++)
                if(a[i]>a[i-1])
                    l=i-1;
         if(l==-1) return -1;
         reverse(a.begin()+l+1,a.end());
         int pos=upper_bound(a.begin()+l+1,a.end(),a[l])-a.begin();
         swap(a[l],a[pos]);
         long long  ans=0;//可能会爆int,要用long,long
         for(int i=0;i<n;i++)
            ans=ans*10+a[i];
        return ans>INT_MAX?-1:ans;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106792494