力扣-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& nums) {
        int p1 = 0,p2=0;
        for(int i = 0;i

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

交换0和2