给定一个包含红色、白色和蓝色、共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.length1 <= n <= 300nums[i]为0、1或2- 进阶:你能想出一个仅使用常数空间的一趟扫描算法吗?
本题是经典的【荷兰国旗问题】,由计算机科学家 Edsger W. Dijkstra 首先提出。
解题思路:方法一:单指针
**两次遍历:**在第一次遍历中,将数组中所有的0交换到数组头部。
第二次遍历中,将数组中所有的1交换到头部的0之后。
csvoid 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
csvoid 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
csvoid 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的个数,对其进行赋值即可。
LeetCode 第75题:颜色分类
IC 见路不走2025-06-16 8:21
相关推荐
一个不知名程序员www3 分钟前
算法学习入门---二分查找(C++)2301_8079973828 分钟前
代码随想录-day26闭着眼睛学算法37 分钟前
【双机位A卷】华为OD笔试之【排序】双机位A-银行插队【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解TL滕38 分钟前
从0开始学算法——第一天(认识算法)小欣加油40 分钟前
leetcode 3318 计算子数组的x-sum Ilove is sour1 小时前
聚类(Clustering)详解:让机器自己发现数据结构烟袅1 小时前
LeetCode 142:环形链表 II —— 快慢指针定位环的起点(JavaScript)CoovallyAIHub1 小时前
OCR战场再起风云:LightOnOCR-1B凭什么比DeepSeekOCR快1.7倍?(附演示开源地址)海琴烟Sunshine2 小时前
leetcode 190. 颠倒二进制位 pythonXの哲學2 小时前
Linux eMMC子系统深度解析:从硬件协议到内核实现