
荷兰国旗问题
设定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;
}
}
}
荷兰国旗问题详解
本文深入解析荷兰国旗问题的三色排序算法,通过三个指针p0、p2和cur的巧妙运用,实现数组中0、1、2的有效排序。算法核心在于如何在遍历过程中仅通过一次交换操作完成排序,同时保持原有数组中1的相对位置不变。

被折叠的 条评论
为什么被折叠?



