Loading

Leetcode-75-颜色分类

题目链接


题目描述

给你一个只含有若干个0,1,2的数组。
使相同的数字挨在一起,并按0,1,2的顺序排列。
如:1,2,1,2,0
输出:0,1,1,2,2

要求

O(n)的时间复杂度

思路

  1. 首先想到的就是sort() 😊 ,但是没有什么排序算法能做到O(n)

  2. 不要把思维局限到排序上,这其实是一个分组的问题。
    借鉴快速排序中partition的思想,把2放到1的右边,把0放到1的左边。

  3. 双指针:p0, p2
    p0左边都是0,p2右边都是2.
    初始时p0=0,p2=len-1
    当 i <= p2 时,执行循环,遍历数组,。
    遇到2时与p2交换位置,并且p2--。
    遇到0时与p0交换位置,并且p0++,i++。
    遇到1时,i++。


C++代码

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int len = nums.size();
        int i = 0, L = 0, R = len -1;
        while(i <= R) {
            if (nums[i] == 2) {
                swap(nums[i], nums[R]);
                R--;
            } else if (nums[i] == 0) {
                swap(nums[i], nums[L]);
                L++, i++;
            } else
                i++;
        }
    }
};
posted @ 2022-01-09 17:25  ARUI丶  阅读(25)  评论(0编辑  收藏  举报