问题描述:
leetcode 75 荷兰国旗问题
有一个数组,存储着三种颜色值红、白、蓝,排序来使得相同的颜色都靠在一起,按红、白、蓝的颜色排序。 为了方便,这里使用0、1、2分别代表红、白。蓝。
问题求解:
解法1:通过交换,对0,1,2进行排序 复杂度O(n)
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int i = 0, j = n;
for(int k=0; k<j; ++k){
if(nums[k] == 0){
swap(nums[i++], nums[k]);
}
else if(nums[k] == 2){
swap(nums[--j], nums[k--]);
}
}
}
};
解法2:计数排序。时间复杂度:O(n)
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int count[3] = {0};
//先遍历一遍数组,统计0,1和2的数量
for(int i=0;i<n;i++){
count[nums[i]]++;
}
//再遍历1遍数组,按照之前统计的数量重新对数组赋值
for(int i=0,j=0;i<3;i++){
while(count[i]--){
nums[j++] = i;
}
}
}
};