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]

💡 解法:三指针 + 一趟扫描(荷兰国旗算法)

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),原地排序,无额外空间

🔚 总结

本题考察对原地排序、双指针/三指针技巧的掌握,是一道非常经典的数组类面试题。务必熟练掌握!

相关推荐
lzhdim13 分钟前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
weixin_3077791320 分钟前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
smj2302_7968265222 分钟前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode
AIGC小尼26 分钟前
ACE-Step-1.5 本地 AI 音乐模型实战|text2music 歌词转人声,部署脚本、参数调优与排坑全记录
人工智能·算法·comfyui·ai漫剧
YOLO数据集集合33 分钟前
树木检测数据集 | 树木检测 树种分类 航拍林业 森林监测9131期
人工智能·算法·机器学习·分类·数据挖掘·林业·树种分类
青山木38 分钟前
Hot 100 --- 下一个排列
java·数据结构·算法·leetcode
垆边人似月.41 分钟前
字符串重排后最大字典序
算法·leetcode·职场和发展
码流子42 分钟前
AI稽核精灵-Agent落地
大数据·人工智能·物联网·算法·系统架构
微三云生态系统架构师-彭丹1 小时前
排队免单资金池专户存管与返本算法:队列模型与熔断保护
算法·熔断机制·排队免单·消费增值·资金池·队列系统·返本算法
wzdark1 小时前
矩阵快速幂算法在图路径计算中的应用4
线性代数·算法·矩阵