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)(原地排序)

✅ 总结

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

✅ 一次遍历

✅ 不使用额外空间

✅ 逻辑紧凑,代码优雅

相关推荐
阿里云云原生8 分钟前
Agent 不再是“玩具”!AgentScope Java 2.0 GA 发布:构建企业级分布式智能体底座
java·开发语言·分布式·agentscope
4154119 分钟前
MyBatis-Plus + PostGIS 实战(四):GeoJSON 序列化与前端地图对接,全局 WKT + 局部 GeoJSON,两种格式优雅共存
java·mybatis·postgis·geojson
峥嵘life23 分钟前
Andorid 打开热点,关闭有线网,ifconfig卡死分析解决
java·服务器·网络
五条凪24 分钟前
简单理解 BM25 与 TF-IDF
人工智能·算法·搜索引擎·全文检索·tf-idf
HillVue31 分钟前
Token 叙事退潮,DAA 重新定义 AI 价值标准
java·人工智能·eclipse
行者全栈架构师34 分钟前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
TCW112137 分钟前
AI底层系列:用C++实现线性代数的公式推导与算法设计-8.线性变化(3)
c++·人工智能·算法
TDengine (老段)1 小时前
TDengine JOIN 完整语法 — Inner/Outer/ASOF/Window 全语法详解
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
皓月斯语1 小时前
B3849 [GESP样题 三级] 进制转换 题解
c++·算法·题解
中微极客1 小时前
剪枝与量化:让YOLO在边缘设备上高效部署
算法·yolo·剪枝