利用三个下标,最后一个0的待插入下标为i,最后一个1的待插入下标为j,最后一个2的待插入下标为k
思想也很简单,对于原地移动的数组,需要考虑下标和数据之间的关系
如果是0,就要移动到第 i 个位置,同时 i + 1
如果是1,需要移动到第 i + j 个位置,同时 j + 1
如果是2,需要移动到第 i + j + k 个位置,同时 k + 1
这里的移动采用数组插入的方式,不能直接交换!
class Solution {
public void sortColors(int[] nums) {
int i = 0, j = 0, k = 0, length = nums.length;
for (int index = 0; index < length; index++) {
switch (nums[index]) {
case 0:
exchange(nums, i++, index);
break;
case 1:
exchange(nums, i + j++, index);
break;
case 2:
exchange(nums, i + j + k++, index);
break;
}
}
}
private void exchange(int[] nums, int i, int j) {
int num = nums[j];
for (int k = j; k > i; k--) {
nums[k] = nums[k - 1];
}
nums[i] = num;
}
}