具体思路:
第一时间想起了单调栈,可以做,但是中间有个用例细节注意一下;
单调递减栈的栈头必定为最大元素,但是要注意最大元素可能有多个情况,我们要把靠近低位的最大元素进行交换,所以要继续判断;
官方题解则是记录每位的最后一次出现为止,保证该元素在当前判断的之后,就可以进行交换;
具体代码:
1.单调栈版本:
class Solution {
public:
int maximumSwap(int num) {
int temp=num;
string s="";
while(num!=0){
s=char('0'+num%10)+s;
num/=10;
}
vector<int>st;
for(int i=0;i<s.size();i++){
while(!st.empty()&&s[*st.rbegin()]<s[i]){
st.pop_back();
}
st.push_back(i);
}
if(st.size()==s.size())
return temp;
int index=0;
for(int i=0;i<st.size();i++){
if(index!=st[i])
break;
index++;
}
int change=index;
while(change+1<st.size()&&s[st[change]]==s[st[change+1]])
change++;
swap(s[index],s[st[change]]);
int ret=0;
for(int i=0;i<s.size();i++){
ret=ret*10+int(s[i]-'0');
}
return ret;
}
};
2.官方题解版本:
class Solution {
public:
int maximumSwap(int num) {
int ret=num;
vector<int>record(10,-1);
string s=to_string(num);
for(int i=0;i<s.size();i++){
record[s[i]-'0']=i;
}
for(int i=0;i<s.size();i++){
for(int j=9;j>0;j--){
if(record[j]!=-1&&j>int(s[i]-'0')&&record[j]>i){
swap(s[i], s[record[j]]);
return stoi(s);
}
}
}
return num;
}
};