这道题一看就是一道双指针的问题,可惜我想到了双指针没想到怎么做,看了官方的动图明白了怎么做这道题,动图可以看下官方题解里的动图,CSDN里面放不了官方题解建议看一遍动图,代码就很好写出来了
代码如下,和官方实现的略有不同,想法是一样的,毕竟我是看着官方动图写出来,讲解一下我对这道题的思路:有两个变量,一个指向下一个存0的地方(p0),一个指向下一个存1的地方(p1)。当nums[i] == 0的时候就要把该0移到p0的位置上,并且p0要往后挪一位。其次还要注意一点的是,如果p0和p1指向的位置相同,p1也要挪的哦,因为这个地方已经给了0不可能在给1了,所以p1也要挪一位。
下面的if只能写成if不可以写成else if,为什么捏?因为你挪0的时候有可能是0和1就行交换的,你else if就无法判断是不是0和1交换的了,如果强行else if在nums[i] ==0里加条件,这不仅是代码变多了,逻辑上我个人感觉也更难理解了
class Solution {
public:
void sortColors(vector<int>& nums) {
int p0 = 0 , p1 = 0;
for(int i = 0;i < nums.size();++i){
if(nums[i] == 0){
//p0和p1下标相同的时候p1的下标也要加1
if(p0 == p1){
++p1;
}
swap(nums[i],nums[p0]);
++p0;
}
if(nums[i] == 1){//这里一定要用if,因为可能1和0进行了交换
swap(nums[p1],nums[i]);
++p1;
}
}
}
};