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

🔚 总结

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

相关推荐
QxQ么么2 小时前
移远通信(桂林)26校招-助理AI算法工程师-面试纪录
人工智能·python·算法·面试
Mz12215 小时前
day05 移动零、盛水最多的容器、三数之和
数据结构·算法·leetcode
SoleMotive.5 小时前
如果用户反映页面跳转得非常慢,该如何排查
jvm·数据库·redis·算法·缓存
念越5 小时前
判断两棵二叉树是否相同(力扣)
算法·leetcode·入门
未可知7775 小时前
软件设计师(上午题4)、面向对象、uml、设计模式
设计模式·职场和发展·uml
ghie90906 小时前
线性三角波连续调频毫米波雷达目标识别
人工智能·算法·计算机视觉
却话巴山夜雨时i6 小时前
74. 搜索二维矩阵【中等】
数据结构·算法·矩阵
sin_hielo6 小时前
leetcode 3512
数据结构·算法·leetcode
_F_y6 小时前
二分:二分查找、在排序数组中查找元素的第一个和最后一个位置、搜索插入位置、x 的平方根
c++·算法