题目:
解题分析:
用双指针进行一次遍历,p0表示0子串的尾巴,p2表示2子串的头部
遍历开始,i从数组的0开始,找到0,将p0移后一位,继续找;找到2,将2与p2交换,并且p2移前一位,同时i不能移动要循环验证a[i]是否为2,直至不是2,再移动。
这个循环验证很重要,因为可能交换回来的依旧为2.
class Solution {
public void sortColors(int[] nums) {
int n = nums.length;
int p0 = 0, p2 = n - 1;
for (int i = 0; i <= p2; ++i) {
while (i <= p2 && nums[i] == 2) {
int temp = nums[i];
nums[i] = nums[p2];
nums[p2] = temp;
--p2;
}
if (nums[i] == 0) {
int temp = nums[i];
nums[i] = nums[p0];
nums[p0] = temp;
++p0;
}
}
}
}