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

解法:三指针

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

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

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

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

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

合并为:swap(nums[++left],nums[i++]

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

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

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

合并为:swap(nums[--right],nums[i])

注意:结束标志,当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]);
            }
        }   
    }
};
相关推荐
CoderYanger21 分钟前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
厕所博士26 分钟前
红黑树原理前置理解—— 2-3 树
算法·2-3树·红黑树原理理解前置
萌>__<新1 小时前
力扣打卡每日一题————除自身外所有元素的乘积
数据结构·算法
xu_yule1 小时前
算法基础—搜索(2)【记忆化搜索+BFS+01BFS+Floodfill]
数据结构·算法
深蓝海拓2 小时前
PySide6从0开始学习的笔记(一) 学前班
笔记·学习
s09071362 小时前
Xilinx FPGA使用 FIR IP 核做匹配滤波时如何减少DSP使用量
算法·fpga开发·xilinx·ip core·fir滤波
老马啸西风2 小时前
成熟企业级技术平台-10-跳板机 / 堡垒机(Bastion Host)详解
人工智能·深度学习·算法·职场和发展
子夜江寒2 小时前
逻辑回归简介
算法·机器学习·逻辑回归
软件算法开发2 小时前
基于ACO蚁群优化算法的多车辆含时间窗VRPTW问题求解matlab仿真
算法·matlab·aco·vrptw·蚁群优化·多车辆·时间窗
EveryPossible2 小时前
优先级调整练习1
大数据·学习