荷兰国旗问题
设定3个指针,p0
之前的数都是0,p2
之后的数都是2,还有一个当前指针cur
发现0,就将其与p0
互换,同时2个指针都往后走(p0
所指的数必定是1,因此cur
可以直接走)
发现2,就将其与p2
互换,但是只让p2
往前走
发现1就不用管了,直接cur
指针往后走
p0
所指的数必定是1,是因为只有当数字为1时,cur
与p0
才会错开。若是0会一起前进,若是2都会原地不动。
void sortColors(vector<int>& nums) {
if(nums.empty()) return;
int size = nums.size();
int p0=0, p2=size-1, cur=0;
while(cur<=p2){
//发现0,就将其与p0互换,同时2个指针都往后走(p0所指的数必定是1,因此cur可以直接走)
if(nums[cur]==0){
nums[cur++]=nums[p0];
nums[p0++]=0;
}
//发现2,就将其与p2互换,但是只让p2往前走
else if(nums[cur]==2){
nums[cur]=nums[p2];
nums[p2--]=2;
//发现1就不用管了,直接cur指针往后走
}else{
++cur;
}
}
}