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

🔚 总结

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

相关推荐
前端架构师-老李6 小时前
进入职场第二课—融入
程序人生·职场和发展
想唱rap6 小时前
Linux开发工具(4)
linux·运维·服务器·开发语言·算法
前端炒粉6 小时前
21.搜索二维矩阵 II
前端·javascript·算法·矩阵
星释7 小时前
Rust 练习册 :Rail Fence Cipher与栅栏密码
开发语言·算法·rust
东方隐侠安全团队-千里7 小时前
第3节 RSA算法开启公钥加密时代
网络·人工智能·算法
7澄17 小时前
深入解析 LeetCode 1:两数之和
算法·leetcode·职场和发展·arraylist
Moonbit7 小时前
MGPIC 初赛提交倒计时 4 天!
后端·算法·编程语言
Miraitowa_cheems8 小时前
LeetCode算法日记 - Day 98: 分割回文串 II
数据结构·算法·leetcode·深度优先·动态规划
立志成为大牛的小牛8 小时前
数据结构——三十九、顺序查找(王道408)
数据结构·学习·程序人生·考研·算法