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

✅ 总结

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

✅ 一次遍历

✅ 不使用额外空间

✅ 逻辑紧凑,代码优雅

相关推荐
2601_955760073 分钟前
Claude API 多人协作中的版本管理方法
java·ai编程
梦想的旅途213 分钟前
企业微信API二次开发:外部群模块功能清单与全场景对接
java·python·企业微信
校招VIP37 分钟前
[校大]27届东华理工大学JAVA简历:中厂简历通过率30%
java·秋招·校招·实习·产品岗·27届
老白干1 小时前
基于 Spring AOP 的操作日志记录:以 DeptController 增删接口为例
java·python·spring
饼饼学习空间智能1 小时前
遥操作数据能否提升机器人自主化水平?详解模仿学习、仿真放大与Sim2Real闭环
人工智能·算法
晚安code2 小时前
Java编程规范避坑指南:阿里开发手册15条强制规约实战解析
java·后端
间歇性努力持续性发呆的野生快乐选手2 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先
小蒜学长2 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
郝学胜_神的一滴2 小时前
干货版《算法导论》17:双数极值配对与卡牌手牌编码最优解
数据结构·算法
萧瑟余晖3 小时前
Java深入解析篇十八之响应式编程
java·开发语言