力扣-75-颜色分类
其实这题本质上其实是排序,而且跟快排非常像,但又不完全像
这题其实相当于一个简化版的快排,只需要将数组划分为3个部分就可以了
但不一样的地方又在于,快排算法是相当于递归了“单指针”的划分过程,而这道题目使用的“双指针”一次遍历划分
官方题解
官方题解给出了两种双指针的解法
交换0和1
指针1左边都是0,即指针1指向第一个1;指针2指向第一个2
每次指针1右移指针2都要随着向后移动一位
当指针1小于(不等于)指针2的时候,说明他俩中间(指针1指向1)还有1;
如果再遇到0,直接跟指针1交换再指针1+1的话,会有一个1被换到后面去,所以遇到这种情况时,换完之后,就视为又遇到了1,将它和指针2指向的元素交换(不额外++)
class Solution {
public:
void sortColors(vector<int>& nums) {
int p1 = 0,p2=0;
for(int i = 0;i<nums.size();++i){
if(nums[i]==0){
swap(nums[p1],nums[i]);
if(p1<p2){
swap(nums[p2],nums[i]);
}
p2++;
p1++;
}else if(nums[i]==1){
swap(nums[p2],nums[i]);
p2++;
}
}
}
};

那么我们都知道排序算法有 稳定/不稳定 的区分,这个算法又是否稳定呢?
首先对于数字2肯定是稳定的,因为就没动过它,它的相对位置是不变的
那么对于数字1,相对位置也没变;但在交换0的额外步骤中,最前面的1被换到“1序列”的最后面去了,所以说它是不稳定的排序过程

浙公网安备 33010602011771号