算法实战笔记: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) 空间,是最优解
相关推荐
Niuguangshuo8 小时前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶8 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
M78佐菲8 小时前
51单片机学习笔记:ds18b20要点整理
linux·笔记·嵌入式硬件·学习·51单片机
高亦真8 小时前
今天是学习嵌入式的第37天
linux·学习·算法
蒸蒸yyyyzwd10 小时前
从面经中学到的三件事
c++·笔记
罗西的思考10 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技11 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字32212 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
IT小白杨12 小时前
社媒多账号运营的环境隔离:一张图谱模型,解释清“为什么换IP还是被连坐“
经验分享·笔记·矩阵·指纹浏览器
huang57914714 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法