LeetCode每日一题2025-05-17
75. 颜色分类 M
给定一个包含红色、白色和蓝色、共 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]
提示:
n == nums.length1 <= n <= 300nums[i]为0、1或2
问题分析
经典的“Dutch National Flag”问题,需要在一次遍历中将数组分为三部分:
- 0(红色)
- 1(白色)
- 2(蓝色)
算法思路
使用三个指针:
low指向下一个放置 0 的位置;mid用于扫描当前元素;high指向下一个放置 2 的位置;
初始时:low = 0,mid = 0,high = n-1。
遍历过程(当 mid <= high):
- 若
nums[mid] == 0,则与nums[low]交换,low++, mid++; - 若
nums[mid] == 1,mid++; - 若
nums[mid] == 2,则与nums[high]交换,high--(mid不动,以便新换来的元素再处理)。
这样只需一次扫描,即可将所有元素分类并就地排序。
时间复杂度
- 时间复杂度:,只遍历一次数组
- 空间复杂度:,原地交换,不使用额外空间
代码实现
1 | class Solution: |
两遍计数 + 原地覆盖
1 | from typing import List |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Stay hungry. Stay foolish.!
评论
