LeetCode 75. Sort Colors【双指针+排序+数组】⭐⭐⭐⭐⭐

题目描述

在这里插入图片描述

知识点

排序、数组、双指针

结果

在这里插入图片描述

实现

码前思考

  1. 题目要求in-place,而且还要尝试是否能够come up with a one-pass algorithm using only constant space
  2. in-place我还可以,但是后面那个条件我有点想不到啊,所以只有暴力计数了;

代码实现

暴力计数

//想不出好的办法,直接传统吧,计数走起,后面再补
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int cnt0=0;
        int cnt1=0;
        int cnt2=0;

        for(int i=0;i<nums.size();i++){
            switch(nums[i]){
                case 0:
                    cnt0++;
                    break;
                case 1:
                    cnt1++;
                    break;
                case 2:
                    cnt2++;
                    break;
                default:
                    ;
            }
        }

        int cnt = 0;
        for(int i=0;i<cnt0;i++){
            nums[cnt] = 0;
            cnt++;
        }

        for(int i=0;i<cnt1;i++){
            nums[cnt] = 1;
            cnt++;
        }

        for(int i=0;i<cnt2;i++){
            nums[cnt] = 2;
            cnt++;
        }
    }
};

高级做法——双指针

参考的题解是官方的题解——颜色分类
在这里插入图片描述

//参考标准答案,使用双指针进行解题
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0=0;
        int p2=nums.size()-1;
        int curr=0;
        
        while(curr <= p2){
            //cout<<curr<<endl;
            if(nums[curr] == 0){
                nums[curr] = nums[p0];
                nums[p0] = 0;
                //移动两个
                p0++;
                curr++;
            }else if(nums[curr] == 2){
                nums[curr] = nums[p2];
                nums[p2] = 2;
                p2--;
            }else{
                curr++;
            }
        }
    }
};

码后反思

  1. 这道题最大的作用就是让我知道了怎么使用双指针解这道题,太妙了!
  2. p0代表0的右边界,p2代表2的左边界。妙不可言;
  3. 对于p0curr交换,两者都要加加;
  4. 对于p2curr交换,只需要减减p2,不需要移动curr,因为交换的值可能还需要再进行交换。这是这道题目比较难想的一个地方。
    在这里插入图片描述

二刷代码

二刷的时候不小心看见了提示,所以知道得用左右指针来解题,知道left表示0的边界,right表示1的边界。但是还是没有搞清楚curpright交换之后应该进行什么操作才对!这个其实讲道理很难讲,还是要自己多举几个例子好好理解!

//采用指针的方法进行解题,这里有两个边界,同时也有一个表示当前处理的元素
class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left=0;
        int curp=0;
        int right=nums.size()-1;

        while(curp<=right){
            if(nums[curp]==0){
                swap(nums[left],nums[curp]);
                left++;
                curp++;
            }else if(nums[curp]==2){
                swap(nums[right],nums[curp]);
                right--;
            }else{
                curp++;
            }
            // for(auto num : nums){
            //     printf("%d ",num);
            // }
            // printf("\n");
        }
    }
};

这个解法有个隐含的信息——leftcurp之间应该全部是1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值