力扣-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序列”的最后面去了,所以说它是不稳定的排序过程

交换0和2

posted @ 2022-06-16 12:06  YaosGHC  阅读(43)  评论(0)    收藏  举报