【力扣hot100题】(097)颜色分类

第一眼感觉有点像确定不同元素个数的排序,但是要保证时间复杂度不超过o(n),即只扫描一遍。

没思路于是看评论区,看到一种很快速的做法,虽然面试不保证通过就是了......

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int count0=0;
        int count1=0;
        int count2=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==0) count0++;
            else if(nums[i]==1) count1++;
            else count2++;
        }
        for(int i=0;i<nums.size();i++){
            if(count0-->0) nums[i]=0;
            else if(count1-->0) nums[i]=1;
            else nums[i]=2;
        }
    }
};

但想法还是很有意思的,记录一下。

之后还是没思路,于是看了答案......

答案是使用指针法,设置指针指向前面0元素的末尾,遍历数组时发现有0元素就与指针交换,然后指针后移一位。

按同样方法使所有2排到最后去。

这样要遍历两边数组,但是很通俗易懂。

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int ptr=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==0){
                swap(nums[ptr],nums[i]);
                ptr++;
            }
        }
        ptr=nums.size()-1;
        for(int i=nums.size()-1;i>=0;i--){
            if(nums[i]==2){
                swap(nums[ptr],nums[i]);
                ptr--;
            }
        }
    }
};

于是答案又给出了双指针的进阶做法,只遍历一遍,然后每次查看是否为0和2,交换就行。

这里我遇到了一点困难,不知道为什么会出错,这是我一开始的错误解法:

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int ptr0=0;
        int ptr2=nums.size()-1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==0){
                swap(nums[ptr0],nums[i]);
                ptr0++;
            }
            else if(nums[i]==2){
                swap(nums[ptr2],nums[i]);
                ptr2--;
            }
            if(ptr2==i) return ;
        }
    }
};

后来想想终于想到了为什么出错,因为单指针时0是从前往后遍历,2是从后往前遍历,这里改成双指针是都是从前往后遍历,会出现交换的两个元素都是2,交换完后直接跳过了这样的错误。

然后我决定用0和1做指针。

有点难些因为遇到0的时候也要附带交换1的指针,所以遇到0的时候交换后要把交换出去的1换回来(如果0指针在1的后面也就是有1元素)。

cpp 复制代码
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int ptr0=0;
        int ptr1=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==0){
                swap(nums[ptr0],nums[i]);
                if(ptr0<ptr1) swap(nums[ptr1],nums[i]);
                ptr0++;
                ptr1++;
            }
            else if(nums[i]==1){
                swap(nums[ptr1],nums[i]);
                ptr1++;
            }
        }
    }
};
相关推荐
可编程芯片开发26 分钟前
基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
算法
Sagittarius_A*1 小时前
后量子密码|通识认知 02|量子威胁核心原理:Shor 算法如何击穿传统公钥密码
算法·信息安全·密码学·量子计算
青山木1 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
其美杰布-富贵-李1 小时前
聚类算法详解:K-means、层次聚类与 DBSCAN
算法·机器学习·kmeans·聚类
碧海银沙音频科技研究院2 小时前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
mifengxing2 小时前
LeetCode 238 除自身以外数组的乘积|无除法O(n)时间+O(1)空间双解法
java·算法·leetcode
依然鸣2 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
丢掉幻想准备斗争2 小时前
5.5树与二叉树的应用
算法
ZhouDevin3 小时前
算法论文/模型微调2——仅骨干1%~3% 参数达到与全量微调相当的性能
算法
Sinosecu-OCR3 小时前
文通OCR技术深度解析:自研算法如何搞定复杂场景识别?
算法·ocr·ocr识别系统