### 解题思路

把尽可能高位的最小数字和尽可能低位的最大数字进行交换

1.从低位到高位进行遍历,保存遍历到当前位为止的最大数的位置

2.从高位到低位进行遍历,找到第一个小于后位的最大数进行交换

### 代码

class Solution {
public:
    vector<int> hm;
    int maximumSwap(int num) {
        string nums = to_string(num);
        hm = vector<int>(nums.size(),0);
        int maxid = nums.size() - 1;
        for(int i = nums.size() - 1; i >= 0; --i){
            if(nums[i] > nums[maxid]) maxid = i;
            hm[i] = maxid;
        }
        for(int i = 0; i < nums.size();++i){
            if(nums[i] != nums[hm[i]]){
                swap(nums[i],nums[hm[i]]);
                break;
            }
        }
        return stoi(nums);
    }
};