📌 题目描述
给定一个包含红色、白色和蓝色的数组 nums
(分别用整数 0、1 和 2 表示),请你原地对它们进行排序,使得相同颜色的元素相邻,顺序为:
红色 (0) → 白色 (1) → 蓝色 (2)
要求 :不能使用库函数 sort
,且需要原地操作,空间复杂度为 O(1)
。
✨ 示例
输入: nums = [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
💡 解法:三指针 + 一趟扫描(荷兰国旗算法)
python
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) - 1
while curr <= right:
if nums[curr] == 0:
nums[left], nums[curr] = nums[curr], nums[left]
left += 1
curr += 1
elif 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)
,原地排序,无额外空间
🔚 总结
本题考察对原地排序、双指针/三指针技巧的掌握,是一道非常经典的数组类面试题。务必熟练掌握!