/**
* Index: 75
* Title: Sort Colors
* Author: ltree98
**/
题意
给定一个数组,数组内数字为0,1,2;将数组按照由小到大 原地 排序。
Follow up:
-
最直接的做法是遍历两遍数组,第一遍记录0、1、2数量,第二遍根据数量覆盖数组元素(计数排序)
-
有没有只遍历一遍数组且用常量级空间的方法?
我的
思路
遇到这种原地排序,只遍历一遍的,一般就是交换。
数组内数字只有0、1、2,所以,采用两个指针向中间遍历:
- 首指针遇到0则过
- 尾指针遇到2则过
- 如果首指针遇到2 或 尾指针遇到0,则收尾交换
- 如果收尾指针相同,均为1,则记录该位置
大概就是这个流程,再根据记录位置进行修改。
时间复杂度:O(n)
空间复杂度:O(1)
实现
class Solution {
public:
void sortColors(vector<int>& nums) {
if(nums.size() <= 1)
return;
int i = 0;
int j = nums.size() - 1;
int k = -1;
while(i < j) {
if(nums[j] == 2) {
--j;
continue;
}
if(nums[i] == 0) {
if(k == -1) {
++i;
}
else {
nums[k] = nums[k] ^ nums[i];
nums[i] = nums[k] ^ nums[i];
nums[k] = nums[k] ^ nums[i];
++k;
}
continue;
}
if(nums[i] == nums[j]) {
if(k == -1)
k = i;
++i;
}
if(nums[i] > nums[j]) {
nums[i] = nums[i] ^ nums[j];
nums[j] = nums[i] ^ nums[j];
nums[i] = nums[i] ^ nums[j];
continue;
}
}
}
};