75 颜色的种类

题目

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库的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)
posted @ 2022-10-19 22:32  一树懒  阅读(42)  评论(0)    收藏  举报