LeetCode 75. 颜色分类(荷兰国旗问题)
75. 颜色分类
📌 题目描述
给定一个包含红色、白色和蓝色的数组 nums
(分别用整数 0、1 和 2 表示),请你原地对它们进行排序,使得相同颜色的元素相邻,顺序为:
红色 (0) → 白色 (1) → 蓝色 (2)
要求:不能使用库函数 sort
,且需要原地操作,空间复杂度为 O(1)
。
✨ 示例
输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
💡 解法:三指针 + 一趟扫描(荷兰国旗算法)
class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# 三指针:left指向0的右边界,right指向2的左边界,curr遍历当前元素left, curr, right = 0, 0, len(nums) - 1while curr <= right:if nums[curr] == 0:nums[left], nums[curr] = nums[curr], nums[left]left += 1curr += 1elif nums[curr] == 2:nums[right], nums[curr] = nums[curr], nums[right]right -= 1# 注意:这里不能curr += 1,因为交换过来的元素需要继续判断else:curr += 1
📍 解题思路详解
这是经典的荷兰国旗问题,核心思想是使用三个指针划分区域:
-
left
:左边界,所有 0 应该放在这里 -
right
:右边界,所有 2 应该放在这里 -
curr
:当前正在遍历的元素
🧠 三种情况:
nums[curr] | 操作 | 指针更新 |
---|---|---|
0 | 与 left 交换 | left += 1, curr += 1 |
1 | 保持不动 | curr += 1 |
2 | 与 right 交换 | right -= 1 (curr 不变) |
⏱️ 时间与空间复杂度
-
时间复杂度:
O(n)
,每个元素最多只被遍历一次 -
空间复杂度:
O(1)
,原地排序,无额外空间
🔚 总结
本题考察对原地排序、双指针/三指针技巧的掌握,是一道非常经典的数组类面试题。务必熟练掌握!