1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int minimumSwaps(int[] nums) {
int minIdx = 0, maxIdx = 0, max = nums[0], min = nums[0];
for (int i = 0; i < nums.length; i++) {
if (nums[i] >= max) {
max = nums[i];
maxIdx = i;
} else if (nums[i] < min) {
min = nums[i];
minIdx = i;
}
}
return minIdx <= maxIdx ? minIdx - 0 + nums.length - 1 - maxIdx : minIdx + nums.length - 1 - maxIdx - 1;
}
}

我们找到最靠左的最小值, 以及最靠右的最大值. 然后看最小值的index是否比最大值的index小, 如果是, 那么两个数字各自swap各自的. 如果最大值的index比最小值的index小, 那么最小值swap到最左边的时候, 最大值会往右swap一格, 我们再把最大值swap到最右边的时候可以少swap一次.

时间复杂度: O(n)
空间复杂度: O(1)