思路
这道题的思路是什么,首先典型荷兰国旗问题:
该问题的关键在于我们要将所有的0放到数组的前部,所有的1放在中间,所有的2放在后部。这可以通过使用两个指针,一个指向数组开头的“0”的最后一个位置,另一个指向数组结尾的“2”的第一个位置,以及一个用来遍历数组的当前指针来实现。
- low指针:在数组的开始位置,它的前面(不包括low自身)是排好的0。
- high指针:在数组的结束位置,它的后面(不包括high自身)是排好的2。
- current指针:用来遍历数组,探索未知的部分。
遍历过程中:
- 如果遇到0,则将其与low指针指向的位置交换,然后移动low指针和current指针。
- 如果遇到1,则不做交换,只移动current指针。
- 如果遇到2,则将其与high指针指向的位置交换,然后仅移动high指针。
由于我们始终将2换到数组的尾部,这意味着交换到前面的元素(未经current检查的元素)需要再次检查,因此当current <= high时,继续遍历。
代码如下:
public void sortColors(int[] nums) {
int low = 0, high = nums.length - 1, current = 0;
int temp;
while (current <= high) {
switch (nums[current]) {
case 0:
// 交换当前元素和low指向的元素
temp = nums[current];
nums[current] = nums[low];
nums[low] = temp;
low++;
current++;
break;
case 1:
// 不做交换,只移动current
current++;
break;
case 2:
// 交换当前元素和high指向的元素
temp = nums[current];
nums[current] = nums[high];
nums[high] = temp;
high--;
break;
}
}
}