【排序】LeetCode 75. Sort Colors

LeetCode 75. Sort Colors

Solution1:
参考自:《leetcode-cpp 答案》
由于0,1,2非常紧凑,首先想到计数排序(counting sort),但需要扫描两遍,不符合题意
【注意】能用原始数组就用原始数组,真的是比模板快好多

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int count[3] = {0};
        for (auto i: nums)
            count[i]++;
        int index = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < count[i]; j++)
                nums[index++] = i;
        }
        return;
    }
};

Solution2:
参考自:https://www.cnblogs.com/ganganloveu/p/3703746.html
设置两个index,left记录第一个1的位置,left左边为0,right记录第一个非2的位置,right右边为2.
然后使用i从头到尾扫一遍,直到与right相遇。
i遇到0就换到左边去,遇到2就换到右边去,遇到1就跳过。
需要注意的是:由于left记录第一个1的位置,因此A[left]与A[i]交换后,A[left]为0,A[i]为1,因此i++;
而right记录第一个非2的位置,可能为0或1,因此A[right]与A[i]交换后,A[right]为2,A[i]为0或1,i不能前进,要后续判断。
由此该数组分为4段:[0,left)–>0; [left,i)–>1; [i,right]–>乱序; (right,n-1]–>2
这里写图片描述

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        for (int i = 0; i <= right;) { //attention!!!
            if (nums[i] == 0) {
                swap(nums[i++], nums[left++]);
            } else if (nums[i] == 2) {
                swap(nums[i], nums[right--]);
            } else
                i++;
        }
        return;
    }
};

猜你喜欢

转载自blog.csdn.net/allenlzcoder/article/details/80909093