leetcode 颜色分类 中等

leetcode 颜色分类 中等

 

 

三路快排的 partition,将小于枢轴 tar 的数放左边,大于枢轴的数放右边,且中间全是枢轴值。即有三个下标 l, cur, r,其中 [0, r) 的值小于 tar,[l, r] 的值等于 tar,(r, nums.size) 大于 tar。

可以这样理解代码:

如果 nums[cur] < tar,那么必然可以直接交换 nums[cur] 与 nums[l],且 ++l,且 ++cur

如果 nums[cur] > tar,那么必然可以直接交换 nums[cur] 与 nums[r],且 --r,但不能 ++cur,因为 nums[r] 的值与 tar 相比大小未知,由于是进行的 swap,所以直接不 ++cur 即可。

如果 nums[cur] == tar,直接 ++ cur 即可。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int l = 0, r = nums.size() - 1, cur = 0;
        int tar = 1;
        while(cur <= r) {
            if(nums[cur] > tar) {
                swap(nums[r], nums[cur]);
                -- r;
                continue;
            }
            if(nums[cur] < tar){
                swap(nums[l], nums[cur]);
                ++ l;
            }
            ++ cur;
        }
    }
};

 

上一篇:3rd party order swap and sales from stock


下一篇:linux配置交换空间