LeetCode 第75题:颜色分类

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

使用整数0、1和2分布表示红色、白色和蓝色。

必须在不使用库内置sort函数的情况下解决这个问题。

示例1:

cs 复制代码
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例2:

cs 复制代码
输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i]012
  • 进阶:你能想出一个仅使用常数空间的一趟扫描算法吗?

本题是经典的【荷兰国旗问题】,由计算机科学家 Edsger W. Dijkstra 首先提出。
解题思路:

方法一:单指针

**两次遍历:**在第一次遍历中,将数组中所有的0交换到数组头部。

第二次遍历中,将数组中所有的1交换到头部的0之后。

cs 复制代码
void swap(int *a,int *b)
{
    int t = *a;
    *a = *b,*b = t;
}

void sortColors(int *nums,int numsSize)
{
    int ptr = 0;
    for(int i=0;i<numsSize;++i)
    {
        if(nums[i]==0)
        {
            swap(&nums[i],&nums[ptr]);
            ++ptr;
        }
    }
    for(int i=ptr;i<numsSize;i++)
    {
        if(nums[i]==1)
        {
            swap(&nums[i],&nums[ptr]);
            ++ptr;
        }
    }
}

时间复杂度:O(n),其中n是数组nums的长度。

空间复杂度:O(1)

方法二:双指针

使用两个指针分别来交换0和1

cs 复制代码
void swap(int *a,int *b)
{
    int t= *a;
    *a= *b,*b=t;
}

void sortColors(int *nums,int numsSize)
{
    int p0 = 0,p1=0;
    for(int i=0;i<numsSize;i++)
    {
        if(nums[i]==1)
        {
            swap(&nums[i],&nums[p1]);
            p1++;
        }else if(nums[i]==0)
        {
            swap(&nums[i],&nums[p0]);
            if(p0<p1)  swap(&nums[i],&nums[p1]);
            ++p0,++p1;
        }
    }
}

时间复杂度:O(n),其中n是数组nums的长度

空间复杂度:O(1)

方法三:双指针

左指针P0来交换0

右指针P2来交换2

cs 复制代码
void swap(int *a,int *b)
{
    int t=*a;
    *a=*b,*b=t;
}

void sortColors(int *nums,int numsSize)
{
    int p0=0,p2=numsSize-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[p0]);
            ++p0;
        }
    }
}

时间复杂度:O(n),其中n是数组nums的长度

空间复杂度:O(1)

方法四:记录0 1 2的个数,对其进行赋值即可。

相关推荐
Merlos_wind14 分钟前
HashMap详解
算法·哈希算法·散列表
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F3 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业4 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn4 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室5 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星5 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿6 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨6 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月6 小时前
map与unordered_map区别
算法·哈希算法