力扣第75题 颜色分类
- 题目描述
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
解法
方法1:
相对直观单指针
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int ptr=0;
for(int i=0;i<n;i++)
{
if(nums[i]==0)
{
swap(nums[i],nums[ptr]);
ptr++;
}
}
for(int j=ptr;j<n;j++)
{
if(nums[j]==1)
{
swap(nums[j],nums[ptr]);
ptr++;
}
}
}
};
方法2:
双指针
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int ptr1=0;
int ptr2=0;
for(int i=0;i<n;i++)
{
if(nums[i]==0)
{
swap(nums[i],nums[ptr1]);
if(ptr2>ptr1)
{
swap(nums[i],nums[ptr2]);
}
ptr1++;
ptr2++;
}
else if(nums[i]==1)
{
swap(nums[i],nums[ptr2]);
ptr2++;
}
}
}
};
方法3:双指针,但与二不同的是指针分别指向头和尾
class Solution {
public:
void sortColors(vector<int>& nums) {
int n =nums.size();
int p1=0;
int p2=n-1;
for(int i=0;i<=p2;i++)
{
while(i<p2&&nums[i]==2)
{
swap(nums[i],nums[p2]);
p2--;
}
if(nums[i]==0)
{
swap(nums[i],nums[p1]);
p1++;
}
}
}
};
方法四:直接发预留空间
class Solution {
public:
void sortColors(vector<int>& nums) {
int n =nums.size();
int n0=0;
int n1=0;
int n2=0;
for(int i=0;i<n;i++)
{
if(nums[i]==0)
{
n0++;
}
if(nums[i]==1)
{
n1++;
}
if(nums[i]==2)
{
n2++;
}
}
for(int j=0;j<n;j++)
{
if(j<n0)
{
nums[j]=0;
}
else if(j<n0+n1)
{
nums[j]=1;
}
else
{
nums[j]=2;
}
}
}
};