leetcode 75.颜色分类
思路:荷兰国旗问题
这道题和这个经典问题是同一个问题。
其实就是00,11,22这中间两个逗号就是划分线,刚开始的时候,线在数组的两端。
可以观察看到,第一个逗号的左边是0,第二个逗号的右边是2,也就是说,第一个划分线的左边必须全是0才行;第二个划分线的右边必须全是2才行。
所以这样就可以下个结论:我们可以用双指针的做法,把这些数回归到它们该回归的地方去。
因此,会有三个变量l,r,i。最后一个变量表示当前遍历元素的变量下标。
当nums[i]==0的时候,我们就把它和左指指向的元素交换,然后我们再让左指针向前移,然后i变量也向前移;
当nums[i]==2的时候,我们就把它和右指针指向的元素进行交换,然后我们再让右指针向后移动,这个时候注意,i是不会发生变化的,因为i必须在l和r中间,并且,当右指针变化的时候i不用变化的原因就是:这个时候交换了的元素我们还没有遍历到,我们需要再次遍历这个位置上的元素,判断它的值是多少。
之后以此类推,当i超出了r边界的时候,我们就停止即可。
class Solution {
public void sortColors(int[] nums) {
int l=0;
int r=nums.length-1;
int i=0;
while(i<=r){
if(nums[i]==0){
int tmp=0;
tmp=nums[i];
nums[i]=nums[l];
nums[l]=tmp;
l++;
i++;
}
else if(nums[i]==2){
int tmp=0;
tmp=nums[i];
nums[i]=nums[r];
nums[r]=tmp;
r--;
}
else{
i++;
}
}
}
}