670. Maximum Swap
Question:
Given a non-negative integer, you could swap two digits at most once to get the maximum valued number. Return the maximum valued number you could get.
Example 1:
Input: 2736
Output: 7236
Explanation: Swap the number 2 and the number 7.
Example 2:
Input: 9973
Output: 9973
Explanation: No swap.
Note :
The given number is in the range [0, 10^8]
分析:
我们需要记录一个从第i项开始的,可以代表最大数字的索引的位置的数组。
例如:
input 5 4 4 1 2
pos 0 2 2 4 4
input[ pos ] 5 4 4 2 2
因此,我们只需要去找到第一个input[ i ] != input[ pos[ i ] ]的组合,然后交换它们。
class Solution {
public:
int maximumSwap(int num) {
string input = to_string(num);
int n = input.length();
vector<int> pos(n, -1);
// 记录目前最大的数字的下标
int curMaxPos = n - 1;
for (int i = n - 1; i >= 0; i--) {
if (input[i] > input[curMaxPos]) {
curMaxPos = i;
}
pos[i] = curMaxPos;
}
// 交换第一个input[i] != input[pos[i]]的组合
for (int i = 0; i < n; i++) {
if(input[pos[i]] != input[i]) {
swap(input[i], input[pos[i]]);
break;
}
}
return stoi(input);
}
};