leetcode——颜色分类

简单粗暴:直接对数组进行sort()排序

思路1:(单指针,两次遍历)
1)对元素为0的交换到前面
2)对元素为1的交换到0后面

代码1:

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

思路2:(双指针,一次遍历)
1)对元素为1的交换到前面
2)对元素为0的交换到前面p0,同时因为将1换出,需要将值放入p1中

代码2:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0 = 0, p1 = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == 1) {
                swap(nums[i], nums[p1]);
                p1++;
            } 
            else if (nums[i] == 0) {
                swap(nums[i], nums[p0]);
                if (p0 < p1)//将num[i]放入nums[p0],当前num[i]为1,放入nums[p1]
                    swap(nums[i], nums[p1]);
                p0++;
                p1++;
            }
        }
    }
};

思路3:
1)对元素为2的交换到后面(注意头元素和尾元素都为2的情况)
2)对元素为0的交换到前面

代码3:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int p0 = 0, p2 = nums.size() - 1;
        for (int i = 0; i <= p2; i++) {
            //处理num[i]与num[p2]都为2的情况
            while (i <= p2 && nums[i] == 2) {
                swap(nums[i], nums[p2]);
                p2--;
            }
            //将0交换到前面
            if (nums[i] == 0) {
                swap(nums[i], nums[p0]);
                p0++;
            }
        }
    }
};

上一篇:理财扫盲之什么叫通货膨胀


下一篇:1、LED灯实验