题目
假定有红、白、蓝三个颜色,分别用 0、1、2 来表示。原地对他们进行排序。
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
原题链接:https://leetcode-cn.com/problems/sort-colors/
思路
双指针法:用 start 和 end 指向 序列1 的起始和末尾,具体的是 [start, end)。如果 start < end,则说明这个区间不是一个空序列。遍历数组,如果遇到 0,则把 0 塞到 start 处,如果区间不是空序列,需要把置换出来的 1 塞到 end 处;如果遇到 1,则把 1 塞到 end 处。直到遍历完数组为止。
统计法:直接遍历一遍,统计有多少个0,多少个1,多少个2。然后重写一次数组。
- 复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(1)
代码
class Solution {
public:
void sortColors(vector<int>& nums) {
int start = 0;
int end = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == 0) {
swap(nums[i], nums[start]);
if (start < end) {
swap(nums[i], nums[end]);
}
start++;
end++;
}
else if (nums[i] == 1) {
swap(nums[i], nums[end]);
end++;
}
}
}
};