这道题如果不考虑进阶方法,可以很轻松的使用排序直接得到答案:
public void sortColors(int[] nums) { Arrays.sort(nums); }
但如果需要按照进阶的要求,不允许使用自带排序并要求一次遍历,我们可以用双指针进行求解。我们通过两个指针,pre0和pre1,分别表示下一个将于0或者1交换位置的下标。因为最终结果0会排在1的前面,所以pre0一定小于或等于pre1,而当检索到nums[i]=0且在pre0<pre1时,发生的情况是,我们已经插入过1,所以此时我们需要在pre0下标处改为0后,将置换出去的1补在pre1的下标上,在将原来的pre1对应的值放置在i的位置上。
public void sortColors(int[] nums) { int pre1=0; int pre0=0; for(int i=0;i<nums.length;i++) { if(nums[i]==1) { int temp=nums[i]; nums[i]=nums[pre1]; nums[pre1]=temp; pre1++; continue; } if(nums[i]==0) { int temp=nums[i]; nums[i]=nums[pre0]; nums[pre0]=temp; if(pre1>pre0){ int temp1=nums[i]; nums[i]=nums[pre1]; nums[pre1]=temp1; } pre1++; pre0++; } } }