75. 颜色分类

这篇博客介绍了两种解决力扣中颜色排序问题的方法:一是使用计数排序,通过记录每个元素出现的次数,依次填充数组;二是采用单指针策略,分别将0移到数组前部和2移到后部。这两种算法都有效地实现了数组的原地排序,具有较高的效率。
摘要由CSDN通过智能技术生成

题目

力扣

思路 计数排序

记下每个元素出现的次数,再从头到尾修改nums里的元素。

代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        vector<int> cnt(3);
        for(int num : nums)
            cnt[num]++;
        int count = 0;
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < cnt[i]; j++){
                nums[count++] = i;
            }
        }
    }
};

思路 单指针

用ptr标记开头,从前往后移动,把0全都移到前面来。再用ptr标记结尾,从后往前移动,把2全都移到后面。

代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();
        int ptr = 0;
        for(int i = 0; i < n; i++){
            if(nums[i] == 0){
                swap(nums[i], nums[ptr]);
                ptr++;
            }
        }
        ptr = n - 1;
        for(int i = n - 1; i >= 0; i--){
            if(nums[i] == 2){
                swap(nums[i], nums[ptr]);
                ptr--;
            }
        }
    }
};
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int n = nums.size();
        int ptr0 = 0, ptr2 = n - 1;
        for(int i = 0; i <= ptr2; i++){
            while(i <= ptr2 && nums[i] == 2){
                swap(nums[i], nums[ptr2]);
                ptr2--;
            }
            if(nums[i] == 0){
                swap(nums[i], nums[ptr0]);
                ptr0++;
            }
        }
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值