LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅

LeetCode 75:颜色分类(荷兰国旗问题)------ Java 题解 ✅

🔗 题目链接

👉 https://leetcode.cn/problems/sort-colors/


📖 内容概要

给定一个只包含 0、1、2 的数组 nums,要求 原地排序 ,使得相同颜色相邻,并按 0 → 1 → 2 顺序排列。

本题本质是 荷兰国旗问题(Dutch National Flag Problem) ,要求 一次遍历、常数空间 完成排序。


💡 解题思路(重点)

核心思想:三指针一次遍历

我们将数组划分为四个区间:

复制代码
[0 ... l-1]     → 全是 0
[l ... i-1]     → 全是 1
[i ... r]       → 未处理
[r+1 ... n-1]   → 全是 2

三个指针含义

指针 含义
l 下一个放 0 的位置
r 下一个放 2 的位置
i 当前遍历指针

遍历规则(非常关键)

当遍历到 nums[i] 时:

✅ 情况 1:nums[i] == 0
  • 说明当前元素应该去左边
  • 交换 nums[i]nums[l]
  • l++i++

👉 为什么 i++

  • 因为换过来的数一定是 1(已处理过)

✅ 情况 2:nums[i] == 2
  • 说明当前元素应该去右边
  • 交换 nums[i]nums[r]
  • r--
  • ⚠️ 不移动 i

👉 为什么 i 不动?

  • 换过来的数还没检查过(可能是 0 / 1 / 2)

✅ 情况 3:nums[i] == 1
  • 已经在正确位置
  • 直接 i++

终止条件

java 复制代码
while (i <= r)

i 超过 r,说明所有元素都已分区完成。


✅ AC 代码(Java)

java 复制代码
class Solution {
    public void sortColors(int[] nums) {
        int l = 0, r = nums.length - 1;
        int i = 0;

        while (i <= r) {
            if (nums[i] == 0) {
                swap(nums, i, l);
                i++;
                l++;
            } else if (nums[i] == 2) {
                swap(nums, i, r);
                r--;
            } else {
                i++;
            }
        }
    }

    private void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(n)(一次遍历)
空间复杂度 O(1)(原地排序)

✅ 总结

  • 本题是 经典的数组双指针 / 三指针问题
  • 核心在于 理解指针不移动的原因
  • 是面试中高频出现的 原地排序技巧

✅ 一次遍历

✅ 不使用额外空间

✅ 逻辑紧凑,代码优雅

相关推荐
SL_staff21 分钟前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl092523 分钟前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
shirsl1 小时前
算法 Day 5 树 / 二叉树 + DFS
数据结构·python·算法
码少女1 小时前
Linux--多路转接之select
java·服务器·数据库
木子算法1 小时前
非凸、离散、还耦合:论文里的求解方法是一条四步流水线
人工智能·算法·目标跟踪
虚无的纽扣2 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
张祥6422889042 小时前
牛顿迭代法求解开普勒方程:从RTKLIB源码到数值分析
人工智能·算法·机器学习
Niuguangshuo2 小时前
论文解读:Deep Speech 2,工业级英中端到端 ASR 系统报告
算法·音视频·语音识别
nvvas2 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言
钓鱼的肝2 小时前
csp-j-s总结(2)
c++·经验分享·笔记·算法·青少年编程