题目地址
https://leetcode.com/problems/sort-colors/
题目大意
一个含有n个整数数组,元素由0 1 2
构成,排列随机。在O(n)
时间复杂度,O(1)
空间复杂度下,将其按升序排序。
解题思路
解一
首先遍历一遍,记录0,1,2个数,然后重新填充数组。
解二
使用两个标记为,a记录距离数组起始最近的非0元素,b记录距离数组尾最近的非2元素。遍历两个标记之间,遇到0与a标记元素交换,遇到2与b标记元素交换。
代码
解一
class Solution {
public:
void sortColors(vector<int>& nums) {
if (nums.size() == 0) {
return;
}
int red = 0;
int white = 0;
for (int i = 0; i != nums.size(); ++i) {
if (nums[i] == 0) {
++red;
}
if (nums[i] == 1) {
++white;
}
}
for (int i = 0; i != nums.size(); ++i) {
if (red != 0) {
nums[i] = 0;
--red;
} else if (white != 0) {
nums[i] = 1;
--white;
} else {
nums[i] = 2;
}
}
return;
}
};
解二
class Solution {
public:
void sortColors(vector<int>& nums) {
if (nums.empty()) {
return;
}
int size = nums.size();
int start = 0;
while (start < size && nums[start] == 0) {
start++;
}
int end = size - 1;
while (end >= 0 && nums[end] == 2) {
end--;
}
int i = start;
while (start < end && i <= end && start < size && end >= 0) {
if (nums[i] == 1) {
++i;
continue;
}
if (nums[i] == 0) {
nums[i] = nums[start];
nums[start] = 0;
start++;
} else if (nums[i] == 2){
nums[i] = nums[end];
nums[end] = 2;
end--;
if (nums[start] == 0) {
start++;
i++;
}
}
}
}
};