556. 下一个更大元素 III(贪心)
思路:维护一个非递增序列,从右往左查找如果该数是一个非递增数列,表示它已经是最大值,否则必有解,但要判断是否是 型。
从左往右找到最后一次出现可以交换的数位,因为它后面的数肯定是非递增数列,所以将它翻转一下变成非递减数列,然后用第一个比它大的数与它交换,这样是最优的。
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;
}
};