这个题目一开始并不会做,但是后来硬着头皮还是做了出来(傲娇脸!!)。咋个说呢,思路比较容易想到,就是把0放左边,2放右边,那么中间自然就是1了。我也是这样想的,我也是这样做的,哈哈。下面说一下大体思路。
- 首先有两个指针p0和p2,它们分别从最左端和最右端出发,而且分别始终指向第一个不为0和不为2的值。
- 然后在设置一个指针p从p0触发,直到小于等于p2.
- 如果p所指的数字为0(当然一开始不可能,因为从p0触发指向的肯定不是0),那么将它与p0处的值交换,p0向右移动直到下一个不为0的位置。
- 如果p所指的数字为2,则将它与p2处的值交换,p2向左移动直到下一个不为2的位置。
- 一直到p指针与p2相遇为止。
代码如下:
public void sortColors(int[] nums) {
int p0 = 0, p2 = nums.length - 1, p = p0;
while (p <= p2) {
for (;p0 < nums.length && nums[p0] == 0; ++p0); //p0指向左边第一个不为0的元素
p = p0; //p指针从p0出发
for (;p2 >= 0 && nums[p2] == 2; --p2); //指向右边第一个不为2的元素
for (;p <= p2 && nums[p] != 2 && nums[p] != 0; ++p); //从左到右找到第一个0或者2
if (p <= p2 && nums[p] == 2) { //如果找到了2,那么交换,且p2向前移动
swap(nums, p, p2);
p2--;
} else if (p <= p2 && nums[p] == 0) { //如果找到了0,那么交换,且p0向后移动
swap(nums, p, p0);
p0++;
}
}
}
//交换函数
private void swap(int[] nums, int index1, int index2) {
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
下面是题目给的例子的示意图