在做题中学习(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]);
            }
        }   
    }
};
相关推荐
计算机小白一个1 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^1 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
黑不溜秋的1 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
leegong231112 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
Moonnnn.3 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
大数据追光猿3 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!4 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉4 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生4 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴4 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯