LeetCode 75. 颜色分类

具体思路:

三种思路,单指针,双指针;

1.双指针:

0,1指针:

两个指针指向0元素应该插入的位置和1元素应该插入的位置,调整之后后半部分全是2元素;

但是需要注意的两点:
1.由于1在零后面,所以插入1的时候,不用管,直接p1++即可;
2.由于0在1的前面,插入0后,势必要动后续的1,也就是判定条件为p0<p1情况下,说明0后面已经有排序好的1,所以如果swap 对p0操作,则必定会换一个1到i位置,所以只需要要把换过去的1插入到p1即可;

0,2双指针:

两个指针分别指向0元素应该插入的位置,2元素插入的位置,调整之后中间的自然全是1元素;

但是要注意两点:
1.当换向2位置时,有可能2的位置上已经是2,所以要使用while使得p2移到非2的位置;
2.需要先进行换2判断,后面的可能的0换到前面,方便判断,p0判断和LeetCode 283. 移动零同思想相同;

2.单指针:

每次把同一种元素换到指定位置,但是需要遍历两次;

具体代码:

0,2双指针版本:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p = 0;
        int q = nums.size() - 1;
        for (int i = 0; i <= q; i++) {
            while (i <= q && nums[i] == 2) {
                swap(nums[i], nums[q--]);
            }
            if (nums[i] == 0) {
                swap(nums[i], nums[p++]);
            }
        }
    }
};

0,1双指针版本:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值