classSolution{publicvoidsortColors(int[] nums){int left =0, right = nums.length -1;int i =0;while(i <= right){//遍历数组时nums[i]为0,则与左指针指向数字交换位置,然后左指针和i都向后移动if(nums[i]==0){swap(nums, left, i);
left++;
i++;//当nums[i]为2时,则与右指针指向数字交换位置,然后右指针向左移动,i不变//为什么i不变,为了继续判断交换后的i是否为0,如为0还需要与左指针交换}elseif(nums[i]==2){swap(nums, right, i);
right--;//nums[i]为1,则不交换i向后移动,循环终止条件时i超过了右指针,此时后面已经是2,无需继续交换}else{
i++;}}}publicvoidswap(int[] nums,int i,int j){int temp = nums[i];
nums[i]= nums[j];
nums[j]= temp;}}
(2)双指针(赋值)
无交换,简洁
classSolution{publicvoidsortColors(int[] nums){int left =0, right =0;for(int i =0; i < nums.length; i++){int num = nums[i];
nums[i]=2;//最后剩下的值只有2if(num <2){//只小于2,将left值赋为1,left+1 (碰见0时,原先的1会往后移一位)
nums[left]=1;
left++;}if(num <1){//小于2也小于1,将right值赋为0,left和right都+1
nums[right]=0;
right++;}}}}