class Solution {
public:
int nextGreaterElement(int n) {
#ifdef _commet
这道题乍一看先入为主是单调栈题目,其实跟单调栈没啥太大关系,虽然也可以使用栈这个结构来做,但并没有什么优势。
单调栈的优点在于遍历数组的同时输出或者用vector储存比当前遍历到的元素更大的下一个元素,而在此题中我们是要从右往左遍历,首先求得第一个递减的元素位置,
然后将它与比它更大的最小数交换(如25432,2就是要找的这个位置,与比2更大的最小数3进行交换),最后再将右侧的序列翻转(即将3 5422转为3 2245),
也就是说我们实际上要找的是比特定元素更大的元素,此时右侧序列虽然是单调的,但是并不能在初次遍历就将要求的结果输出或者储存
(比如可能会出现265这种从右往左第一遍遍历时压根就找不到比2更大的数),因此并没有什么优势,跟自己
从右往左再遍历一遍是一样的。当然,右侧序列第二次遍历从左往右遍历也是可以的,因为并不清楚找到的位置元素位于右侧序列的哪个位置,因此都是半斤八两。
#endif
stack<char> st;
string s = to_string(n);
int k=s.size()-1;
while (k && s[k-1]>=s[k])
k--;
if(!k)
return -1;
for(int i=s.size()-1;i>=k;i--)
{
if(s[i]>s[k-1])
{
swap(s[k-1],s[i]);
reverse(s.begin()+k,s.end());
break;
}
}
auto ans=stoll(s);
if (ans > INT_MAX)
return -1;
return ans;
}
};