第六天刷题:多数元素”问题 | 豆包MarsCode AI刷题

100 阅读2分钟

这道题的核心是寻找一个在数组中出现次数超过总数一半的数字,满足这种特性的数字被称为“多数元素”(Majority Element)。本题是经典的多数元素问题,考察了数组排序、统计以及利用特性优化算法的能力。

解题思路

代码中的实现是通过排序数组来解决问题的:

  1. 排序的作用:排序后,出现次数超过一半的数字一定会占据数组的中间位置。因此,直接返回数组中间位置的数字即可。
  2. 时间复杂度:排序的时间复杂度为 O(nlog⁡n)O(n \log n)O(nlogn),虽然不是最优解,但对于一些实际场景仍然是可行的。

代码分析

  1. 代码优点

    • 简洁明了,通过排序+数组中间值的性质快速找到结果。
    • 易于实现,不涉及复杂的数据结构和逻辑。
  2. 代码不足

    • 排序操作增加了额外的时间消耗,无法达到最优的线性时间复杂度。
    • 未进行输入有效性的校验,例如数组为空或题目未保证存在多数元素的情况下可能会出错。

优化思路

这道题可以通过 摩尔投票算法 优化到 O(n)O(n)O(n) 时间复杂度:

  • 基本思想:使用一个计数器,遇到相同的数字时增加计数,遇到不同的数字时减少计数。当计数器归零时,将候选数字更换为当前数字。

  • 理由:由于多数元素的数量超过总数的一半,最终计数器的结果一定指向多数元素。 代码示例如下: public class Main { public static int solution(int[] array) { int candidate = array[0]; int count = 0; for (int num : array) { if (count == 0) { candidate = num; } count += (num == candidate) ? 1 : -1; } return candidate; }

    public static void main(String[] args) { System.out.println(solution(new int[] { 1, 3, 8, 2, 3, 1, 3, 3, 3 }) == 3); } }

收获与总结

  1. 理解问题特性:抓住多数元素的特性是解决问题的关键,而不是单纯依赖暴力计算或排序。
  2. 算法优化:从 O(nlog⁡n)O(n \log n)O(nlogn) 的排序到 O(n)O(n)O(n) 的摩尔投票算法,优化思路简单高效,体现了对算法设计的理解。
  3. 边界条件处理:实际开发中需要考虑输入的有效性,确保算法对异常情况具备健壮性。
  4. 算法迁移能力:摩尔投票算法不仅能解决多数元素问题,还能扩展到其他计数场景,具有广泛的应用价值。

通过这道题,我深刻认识到算法设计中“理解问题”和“抓住特性”的重要性,也对高效算法的设计和优化有了更深的体会。