75. 颜色分类(三指针移动||计数排序)

75. 颜色分类

  •  根据题意提示,用计数排序扫描每个颜色的个数,然后重新往数组里填充012的个数即可,一趟扫描

class Solution {
public:
    void sortColors(vector<int>& nums) {
        map<int,int>mp;
        for(int i=0;i<nums.size();i++)
            mp[nums[i]]++;
        for(int i=0;i<mp[0];i++)
            nums[i]=0;
        for(int i=mp[0];i<mp[0]+mp[1];i++)
            nums[i]=1;
        for(int i=mp[0]+mp[1];i<nums.size();i++)
            nums[i]=2;
    }
};
  • 利用三指针,移动指针来交换数组的元素,L表示中间1区间最左边的位置,R代表中间1区间最右边的位置,表示当前的位置。遇到0就拿当前位置和L位置的元素交换,使得0到左边去,同时L++,因为此时1区间的最右边向左移动一个;遇到1就移动i,使得i++;遇到2就移动i位置和R位置的元素,使得2到右边去,同时R--,因为此时1区间的最右边向左移动一个。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值