在做题中学习(76):颜色分类

解法:三指针

思路:用三个指针,把数组划分为三个区域:

for循环遍历数组,i遍历数组,left是0区间的末尾,right是2区间的开头,0 1 2区间成功被划分

而上面的图画是最终实现的图样,实际left,right的移动得配合numsi来:

left = -1,right = nums.size();

1.numsi == 0,要保证0,left为全0,left++,swap(numsleft,numsi) ,处理完当前numsi,i++

合并为:swap(nums++left,numsi++

2.numsi == 1, 要保证left+1,i-1是全1,所以 i++ 即可保证。

3.numsi == 2,要保证right,n-1是全2,right--,swap(numsright,nums\[i),处理完当前numsi,不用i++,因为此时swap过去的numsrigjt 这个数依旧还没判断呢,所以此时不能i++

numsi == 0的例子i++是因为俩交换的数都已经判断完了。

合并为:swap(nums--right,numsi)

注意:结束标志,当i遍历时,i == right的时候,证明已经排好序了,结束循环即可。

附上思路图:

完整代码:

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) 
    {
        int n = nums.size(),l = -1,r = n;
        for(int i = 0;i<n;)
        {
            if(nums[i] == 0)
                swap(nums[++l],nums[i++]);
            else if(nums[i] == 1)
                i++;
            else if(nums[i] == 2)
            {
                if(i == r) break;
                swap(nums[--r],nums[i]);
            }
        }   
    }
};
相关推荐
码匠许师傅5 分钟前
【C++三方组件】Asio 上篇:回调式 TCP 客户端与服务端
开发语言·c++·tcp/ip
沐欣工作室_lvyiyi10 分钟前
家庭水资源节能系统设计(论文+源码)
c++·python·云平台·单片机毕业设计·单片机仿真·电子信息工程毕业设计·机械电子工程
FelixZhang02815 分钟前
量化求真10|回测通过以后,策略就能上场吗?
人工智能·python·深度学习·学习·机器学习·金融·lstm
Vcaker20 分钟前
Linux学习33-HPA动态扩缩容及k8s调度策略
linux·运维·学习
yi01125 分钟前
LeetCode 134 加油站:从 双循环暴力 演变到 贪心
linux·算法·leetcode
Yyyyyy~26 分钟前
[c++]数组
c++
知识分享小能手33 分钟前
C++ 学习教程,从入门到精通,C++内存模型和名称空间 — 详细知识点总结(9)
开发语言·c++·学习
sogw-三叶草️36 分钟前
LeetCode 989. 数组形式的整数加法
数据结构·算法
2601_9622186141 分钟前
c++中多重继承与虚继承的实现
开发语言·c++
AOI小白新手上路1 小时前
韦东山《ARM 架构与编程》3-2 GPIO 引脚操作方法概述 · 学习笔记
arm开发·学习·架构