1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public int maximumSwap(int num) {
char[] numArray = String.valueOf(num).toCharArray();
int[] greatestRight = new int[numArray.length];
int max = -1, maxIdx = -1;
for (int i = numArray.length - 1; i >= 0; i--) {
if (numArray[i] - '0' > max) {
max = numArray[i] - '0';
maxIdx = i;
greatestRight[i] = i;
} else {
greatestRight[i] = maxIdx;
}
}
for (int i = 0; i < numArray.length; i++) {
if (numArray[i] - '0' < numArray[greatestRight[i]] - '0') {
swap(numArray, i, greatestRight[i]);
return Integer.parseInt(new String(numArray));
}
}
return num;
}

private void swap(char[] numArray, int i, int j) {
char temp = numArray[i];
numArray[i] = numArray[j];
numArray[j] = temp;
}
}

先看第0位, 我们想知道它的右边比它大的值中最大的是谁, 如果有多个最大, 我们想要最右边的那个. 这样的话我们就可以倒着遍历. 然后记录遍历过程中遇到的最大值以及它的index. 如果在某个位置发现此时自己的值比max要小, 那么我们就知道当前位置右侧的比它大的值的index就是maxIdx. 如果遇到的值和记录的值一样大, 我们不需要更新max以及maxIdx, 因为我们想要的是右侧比我们大的值, 其中最大是越远越好. 因此第7行不能是大于等于而只能是等于. 一旦更新, 那么如果下一个值比这个max小, 比它大的值的index就会取离它近的那个而不是远的那个.

时间复杂度: O(n) n是num的长度.
空间复杂度: O(n) 因为用到了numArray和greatestRight.

当然n不超过9, 时间复杂度和空间复杂度都可以认为是O(1).