算法实战笔记:LeetCode 169 多数元素 & 75 颜色分类

目录

[一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间)](#一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间))

题目描述

核心思路

[Java 完整代码](#Java 完整代码)

复杂度分析

[二、75. 颜色分类(三指针,原地排序)](#二、75. 颜色分类(三指针,原地排序))

题目描述

核心思路

[Java 完整代码](#Java 完整代码)

复杂度分析

三、总结(面试必背)


大家好,今天分享两道经典算法题 ------169. 多数元素 (简单)和 75. 颜色分类 (中等),都是面试高频考点,我会用最优解法 + 完整 Java 可运行代码实现,新手也能直接看懂、直接运行。


一、169. 多数元素(摩尔投票法,O (n) 时间 + O (1) 空间)

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊n/2⌋ 的元素,题目保证一定存在。

核心思路

利用摩尔投票法:

  • 维护一个候选值 candidate 和计数器 count
  • 相同数字计数 + 1,不同数字计数 - 1
  • 计数器归零时,更换候选值
  • 最终剩下的候选值就是多数元素(因为它永远无法被完全抵消)

Java 完整代码

java

运行

复制代码
public class MajorityElement {
    // 核心方法:摩尔投票法
    public int majorityElement(int[] nums) {
        int candidate = 0;
        int count = 0;
        
        for (int num : nums) {
            // 计数器归零,更换候选人
            if (count == 0) {
                candidate = num;
            }
            // 相同+1,不同-1
            count += (num == candidate) ? 1 : -1;
        }
        return candidate;
    }

    // 测试主函数
    public static void main(String[] args) {
        MajorityElement solution = new MajorityElement();
        int[] nums = {2, 2, 1, 1, 1, 2, 2};
        System.out.println("多数元素:" + solution.majorityElement(nums));
        // 输出:2
    }
}

复杂度分析

  • 时间复杂度:O (n),仅遍历一次数组
  • 空间复杂度:O (1),无额外空间开销

二、75. 颜色分类(三指针,原地排序)

题目描述

给定一个包含红色、白色、蓝色,共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照 0(红)、1(白)、2(蓝)顺序排列。不能使用库函数排序。

核心思路

三指针法(荷兰国旗问题):

  • p0:0 的右边界,左边全是 0
  • p2:2 的左边界,右边全是 2
  • curr:当前遍历指针
  • 遇到 0 放左边,遇到 2 放右边,遇到 1 跳过

Java 完整代码

java

运行

复制代码
public class SortColors {
    public void sortColors(int[] nums) {
        int p0 = 0;
        int curr = 0;
        int p2 = nums.length - 1;

        while (curr <= p2) {
            if (nums[curr] == 0) {
                // 交换 0 到左区
                swap(nums, curr, p0);
                p0++;
                curr++;
            } else if (nums[curr] == 2) {
                // 交换 2 到右区
                swap(nums, curr, p2);
                p2--;
            } else {
                // 1 留在中间,直接跳过
                curr++;
            }
        }
    }

    // 数组交换工具方法
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    // 测试主函数
    public static void main(String[] main) {
        SortColors solution = new SortColors();
        int[] nums = {2, 0, 2, 1, 1, 0};
        solution.sortColors(nums);
        
        System.out.print("排序结果:");
        for (int num : nums) {
            System.out.print(num + " ");
        }
        // 输出:0 0 1 1 2 2
    }
}

复杂度分析

  • 时间复杂度:O (n),一次遍历完成排序
  • 空间复杂度:O (1),原地排序,无额外空间

三、总结(面试必背)

  1. 多数元素 :用摩尔投票法,空间最优,面试高频送分题
  2. 颜色分类 :用三指针,属于荷兰国旗问题,原地排序经典题
  3. 两道题都做到了 O (n) 时间 + O (1) 空间,是最优解
相关推荐
DP DPharness3 小时前
ClearAI、记忆插件与普通笔记,三种让 Agent 记住的路数对比
笔记
奋发向前wcx4 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
piikee5 小时前
粤语初学入门:从粤拼、九声六调到开口,一个普通话母语者的练习笔记
笔记·粤语入门·怎么学习粤语
念何架构之路7 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
晒太羊的猫8 小时前
hot100动态规划刷题
算法·动态规划
Seraphina368 小时前
SQL注入(二)盲注
网络·数据库·经验分享·笔记·sql
白山编程大哥8 小时前
Carsim 2024.1 专业安装介绍:功能特性与应用场景详解
笔记
hss123456788 小时前
整装落地与效果图差距有多大?从毫米级误差到ENF板材的量化拆解
笔记
weixin_531094698 小时前
heap_4内存管理
java·开发语言·算法
余额瞒着我当琳8 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法