75 颜色的种类
题目
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
难度:中等
题解
方法一:排序,使用冒泡排序
void sortColors(int* nums, int numsSize){
int temp;
for(int i=0;i<numsSize;i++){
for(int j=0;j<numsSize-1;j++){
if(nums[j]>nums[j+1]){
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
}
复杂度分析
- 时间复杂度:O(N^2)
- 空间复杂度:O(n^2)
方法二:双指针,定义两个指针,指针left来交换0,指针right来交换2。此时,left的初始值为0,而right的初始值为n-1.在遍历的过程中,需要找出所有的0交换到数组的头部,并且找出所有的2交换到尾部。
由于此时其中一个指针 right是**从右向左****移动的,因此当我们在从左向右遍历整个数组时,如果遍历到的位置超过了right ,那么就可以直接停止遍历了。具体为
1、如果找到了0,那么将nums[left]与nums[i]交换,并将left后移一个位置
2、如果找到了2,那么将nums[right]与nums[i]交换,并将right向前移动一个位置
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b,*b=tmp;
}
void sortColors(int* nums, int numsSize){
int i=0,tmp;
int left=0,right=numsSize-1;
while(i<numsSize){
if(nums[i]==0 && i>left){
swap(&nums[i],&nums[left]);
left++;
}
else if(nums[i]==2 && i<right){
swap(&nums[i],&nums[right]);
right--;
}
else{
i++;
}
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)