算法实战笔记: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) 空间,是最优解
相关推荐
LccKyI8 分钟前
C# 零基础学习 Day01|基础概念梳理 + 思维导图总结
开发语言·笔记·学习·c#
AKA__Zas12 分钟前
芝士算法(位运算)
java·开发语言·算法·leetcode·学习方法
宵时待雨18 分钟前
linux笔记归纳13:Socket编程UDP
linux·服务器·笔记·udp
wabs66630 分钟前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
hans汉斯32 分钟前
人工智能与机器人研究|面向无标签数据的三维场景语义理解方法研究
人工智能·神经网络·算法·信息可视化·cnn·机器人
疯狂打码的少年43 分钟前
【面向对象】设计模式概述(要素、分类:创建型/结构型/行为型)
笔记
懿路向前1 小时前
【HarmonyOS学习笔记】2026-08-05 | 端插件卡片绑定与跨上下文判断
笔记·学习·ai编程·harmonyos
小程故事多_8011 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
风曦Kisaki11 小时前
Kubernetes(K8s)笔记Day06: 持久化存储(emptyDir,hostPath,NFS),PV 和 PVC,StorageClass存储类
linux·运维·笔记·云原生·容器·kubernetes
2601_9561219712 小时前
二分算法(知识点+题目)
c++·算法