Leetcode75颜色分类

本文介绍了如何使用双指针解决力扣中的一道排序颜色问题,通过分析官方动图,理解了将0和1重新排列的思路。文章详细讲解了代码实现过程,强调了在移动元素时,对于0和1交换的情况,为何不能使用elseif而应使用if进行判断。并提供了完整的C++代码实现。
摘要由CSDN通过智能技术生成

我的力扣主页

题目链接

在这里插入图片描述

这道题一看就是一道双指针的问题,可惜我想到了双指针没想到怎么做,看了官方的动图明白了怎么做这道题,动图可以看下官方题解里的动图,CSDN里面放不了官方题解建议看一遍动图,代码就很好写出来了

代码如下,和官方实现的略有不同,想法是一样的,毕竟我是看着官方动图写出来,讲解一下我对这道题的思路:有两个变量,一个指向下一个存0的地方(p0),一个指向下一个存1的地方(p1)。当nums[i] == 0的时候就要把该0移到p0的位置上,并且p0要往后挪一位。其次还要注意一点的是,如果p0和p1指向的位置相同,p1也要挪的哦,因为这个地方已经给了0不可能在给1了,所以p1也要挪一位。

下面的if只能写成if不可以写成else if,为什么捏?因为你挪0的时候有可能是0和1就行交换的,你else if就无法判断是不是0和1交换的了,如果强行else if在nums[i] ==0里加条件,这不仅是代码变多了,逻辑上我个人感觉也更难理解了

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0 = 0 , p1 = 0;
        for(int i = 0;i < nums.size();++i){
            if(nums[i] == 0){
                //p0和p1下标相同的时候p1的下标也要加1
                if(p0 == p1){
                    ++p1;
                }
                swap(nums[i],nums[p0]);
                ++p0;
            }
            if(nums[i] == 1){//这里一定要用if,因为可能1和0进行了交换
                swap(nums[p1],nums[i]);
                ++p1;
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值