2022-06-16 12:06阅读: 33评论: 0推荐: 0

力扣-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

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16381531.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(33)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起