思路
这道题的思路是什么,首先典型荷兰国旗问题:
该问题的关键在于我们要将所有的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:// 不做交换,只移动currentcurrent++;break;case 2:// 交换当前元素和high指向的元素temp = nums[current];nums[current] = nums[high];nums[high] = temp;high--;break;}}
}