一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/sort-colors/
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意事项:
- 本质是排序0、1、2
2.测试样例
[2,0,2,1,1,0] # [0,0,1,1,2,2]
[2,0,1] # [0,1,2]
[0] # [0]
二、题解
1、依次处理0、1、2🟢(非原地)
1、新建数组 ans
2、外循环遍历3次【0、1、2三个数】,内循环对数组遍历
3、将0依次加入ans,将1依次加入ans....并记录个数
4、重新赋值 nums
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size(),num=0;;
int ans[n];
for(int i=0;i<3;i++){
if(num==n) break;
for(int j=0;j<n;j++){
if(nums[j]==i) ans[num++]=i;
if(num==n)break;
}
}
for(int i=0;i<n;i++){
nums[i]=ans[i];
}
}
};

2、统计0、1、2个数🟢(非原地)
遍历一次数组,用数组ans[3]来记录0、1、2的个数,重新对nums赋值
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int ans[3];
// 新数组全为0
for(int i=0;i<3;i++) ans[i]=0;
// 记录有几个0,1,2
for(int i=0;i<n;i++){
ans[nums[i]]++;
}
int t=0;
// 0,1,2分别添加到原数组
for(int i=0;i<3;i++){
while(ans[i]!=0){
nums[t++]=i;
ans[i]--;
}
}
}
};
3、快速排序🔴(原地)
采用双指针 p , q 。规定:

![]()

1、定义p=0,q=n-1,下标 i=0。通过 i 进行遍历,当 i > q 之后,应完全满足以上条件
2、如果当前 i 指向 2,应与 q 位置元素交换,q --
3、如果当前 i 指向 1,满足条件,i ++
4、如果当前 i 指向 0,由于 i 必大于等于 p
① i 在 p 右侧,与 p 位置元素交换,
② i 与 p 相同,与 p 交换保证代码一致性
i++,p++
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
if(n==1)return;
int p=0,q=n-1,i=0;
while(i<=q){
if(nums[i]==2){
swap(nums[i],nums[q]);
q--;
}
else if(nums[i]==1) i++;
else{
swap(nums[i],nums[p]);
i++;p++;
}
}
}
};

1904

被折叠的 条评论
为什么被折叠?



