问题描述:
一、第一种解题方法-计数排序法
(1)分别统计0,1,2的元素个数
int count[3] = {0}; // 存放0, 1, 2三个元素的频率
for(int i = 0 ; i < nums.size() ; i ++){
assert(nums[i] >= 0 && nums[i] <= 2);
count[nums[i]] ++;
}
注意:assert(nums[i] >= 0 && nums[i] <= 2),养成判断错误的习惯
(2) 然后,重新放回到到数组中
int index = 0;
for(int i = 0 ; i < count[0] ; i ++)
nums[index++] = 0;
for(int i = 0 ; i < count[1] ; i ++)
nums[index++] = 1;
for(int i = 0 ; i < count[2] ; i ++)
nums[index++] = 2;
(3)第一种解法完整实现代码:
#include <cassert>
using namespace std;
// 75. Sort Colors
// https://leetcode.com/problems/sort-colors/description/
//
// 计数排序的思路
// 对整个数组遍历了两遍
// 时间复杂度: O(n)
// 空间复杂度: O(k), k为元素的取值范围
class Solution {
public:
void sortColors(vector<int> &nums) {
int count[3] = {0}; // 存放0, 1, 2三个元素的频率
for(int i = 0 ; i < nums.size() ; i ++){
assert(nums[i] >= 0 && nums[i] <= 2);
count[nums[i]] ++;
}
int index = 0;
for(int i = 0 ; i < count[0] ; i ++)
nums[index++] = 0;
for(int i = 0 ; i < count[1] ; i ++)
nums[index++] = 1;
for(int i = 0 ; i < count[2] ; i ++)
nums[index++] = 2;
}
};
int main() {
int nums[] = {2, 2, 2, 1, 1, 0};
vector<int> vec = vector<int>(nums, nums + sizeof(nums)/sizeof(int));
Solution().sortColors(vec);
for(int i = 0 ; i < vec.size() ; i ++)
cout << vec[i] << " ";
cout << endl;
return 0;
}
二、第二种解题方法-三路快速排序法(Quick Sort 3 Ways)
(1)先用动画演示解题思路
①将数组分成3个部分
②回到本题,我们需要对0,1,2进行排序
③将数组按元素0,1,2分成三个部分
④ 使用下标 i 作为遍历,此时arr[ i ] = e
若e = 1,则arr[ i ] = e; 然后 i++
⑤若arr[ i ] = e, e = 2;则two--;swap( nums[i] , nums[two])
⑥最后完成数组的排序
(2)第二种解题方法的实现代码
// 三路快速排序的思想
// 对整个数组只遍历了一遍
// 时间复杂度: O(n)
// 空间复杂度: O(1)
class Solution {
public:
void sortColors(vector<int> &nums) {
int zero = -1; // [0...zero] == 0
int two = nums.size(); // [two...n-1] == 2
for(int i = 0 ; i < two ; ){
if(nums[i] == 1)
i ++;
else if (nums[i] == 2){
--two;
swap( nums[i] , nums[two]);
}
else{ // nums[i] == 0
assert(nums[i] == 0);
++zero;
swap(nums[zero] , nums[i]);
i++;
}
}
}
};
int main() {
int nums[] = {2, 2, 2, 1, 1, 0};
vector<int> vec = vector<int>(nums, nums + sizeof(nums)/sizeof(int));
Solution().sortColors(vec);
for(int i = 0 ; i < vec.size() ; i ++)
cout << vec[i] << " ";
cout << endl;
return 0;
}
参考资料: