第一次看到这道题,没有读懂是什么意思?比如比“25431” 下一个更大的数是31245
重要性质
- 递减的序列是不存在下一个更大的数的,如4321
算法思路:
- 从低位到高位找到第一个递减的数,即a[i-1]
- 和右边第一个比a[i-1]大的数 a[j],互换位置。
- 最后反转a[i-1]后的序列
可以两次遍历找到a[i-1]和a[j],也可以利用单调栈同时找到这两个数:
- 从右到左遍历,如果序列递增则入栈,若当前元素小于栈定元素,则当前元素即为a[i-1]
- 然后不断出栈,第一个满足栈定元素小于a[i-1]的即为a[j].
class Solution {
public:
int nextGreaterElement(int n) {
string s=to_string(n);
stack<char>st;
int left=-1;
int right=-1;
for(int i=s.size()-1;i>=0;i--){
while(!st.empty()&& s[st.top()]>s[i]){
left=i;
right=st.top();
st.pop();
}
if(left!=-1) break;
st.push(i);
}
if(left==-1) return -1;
swap(s[left],s[right]);
sort(s.begin()+left+1,s.end());
return stol(s)>INT_MAX?-1:stol(s);
}
};