Leetcode-75-颜色分类
题目链接
题目描述
给你一个只含有若干个0,1,2的数组。
使相同的数字挨在一起,并按0,1,2的顺序排列。
如:1,2,1,2,0
输出:0,1,1,2,2
要求
O(n)的时间复杂度
思路
-
首先想到的就是sort() 😊 ,但是没有什么排序算法能做到O(n)
-
不要把思维局限到排序上,这其实是一个分组的问题。
借鉴快速排序中partition的思想,把2放到1的右边,把0放到1的左边。 -
双指针: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++;
}
}
};