算法实战笔记: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) 空间,是最优解
相关推荐
ouliten2 小时前
cuda编程笔记(39)--Asynchronous Barriers(异步屏障)
笔记·cuda
不要秃头的小孩2 小时前
力扣刷题——509. 斐波那契数
python·算法·leetcode·动态规划
U盘失踪了2 小时前
Go 结构体
笔记·golang
We་ct2 小时前
LeetCode 120. 三角形最小路径和:动态规划详解
前端·javascript·算法·leetcode·typescript·动态规划
py有趣3 小时前
力扣热门100题之和为K的子数组
数据结构·算法·leetcode
hipolymers3 小时前
C语言怎么样?难学吗?
c语言·数据结构·学习·算法·编程
xuhaoyu_cpp_java5 小时前
连接池学习
数据库·经验分享·笔记·学习
workflower5 小时前
机器人应用-楼宇室内巡逻
大数据·人工智能·算法·microsoft·机器人·动态规划·享元模式