力扣-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步