【面试经典】多数元素

embedded/2024/12/29 5:55:24/

链接:169. 多数元素 - 力扣(LeetCode)

解题思路:

在本文中,“数组中出现次数超过一半的数字” 被称为 “众数” 。

需要注意的是,数学中众数的定义为 “数组中出现次数最多的数字” ,与本文定义不同。

本题常见的三种解法:

1.哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N) 。
2.数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。
3.摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N) 和 O(1) ,为本题的最佳解法。


摩尔投票:

设输入数组 nums 的众数为 x ,数组长度为 n 。

推论一: 若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 >0 。

推论二: 若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0 ,即后 (n−a) 个数字的 众数仍为 x 。

根据以上推论,记数组首个元素为 n1,众数为 x ,遍历并统计票数。当发生 票数和 =0 时,剩余数组的众数一定不变 ,这是由于:

当 n1 = x : 抵消的所有数字中,有一半是众数 x 。
当 n1 != x : 抵消的所有数字中,众数 x 的数量最少为 0 个,最多为一半。
利用此特性,每轮假设发生 票数和 =0 都可以 缩小剩余数组区间 。当遍历完成时,最后一轮假设的数字即为众数。

算法流程:

1.初始化: 票数统计 votes = 0 , 众数 x。
2.循环: 遍历数组 nums 中的每个数字 num 。
        当 票数 votes 等于 0 ,则假设当前数字 num 是众数。
        当 num = x 时,票数 votes 自增 1 ;当 num != x 时,票数 votes 自减 1 。
3.返回值: 返回 x 即可。

class Solution {public int majorityElement(int[] nums) {int x = 0, votes = 0;for (int num : nums){if (votes == 0) x = num;votes += num == x ? 1 : -1;}return x;}
}

复杂度分析:

  • 时间复杂度 O(N) : N 为数组 nums 长度。
  • 空间复杂度 O(1) : votes 变量使用常数大小的额外空间。

拓展:

由于题目说明“给定的数组总是存在多数元素”,因此本题不用考虑 数组不存在众数 的情况。若考虑,需要加入一个 “验证环节” ,遍历数组 nums 统计 x 的数量。

若 x 的数量超过数组长度一半,则返回 x 。
否则,返回未找到众数。

class Solution {public int majorityElement(int[] nums) {int x = 0, votes = 0, count = 0;for (int num : nums){if (votes == 0) x = num;votes += num == x ? 1 : -1;}// 验证 x 是否为众数for (int num : nums)if (num == x) count++;return count > nums.length / 2 ? x : 0; // 当无众数时返回 0}
}

时间复杂度和空间复杂度都不变,仍为 O(N) 和 O(1) 。


http://www.ppmy.cn/embedded/149651.html

相关文章

典型常见的基于知识蒸馏的目标检测方法总结二

来源:https://github.com/LutingWang/awesome-knowledge-distillation-for-object-detection收录的方法 NeurIPS 2017:Learning Efficient Object Detection Models with Knowledge Distillation CVPR 2017:Mimicking Very Efficient Networ…

【玩转OCR】 | 腾讯云智能结构化OCR在多场景的实际应用与体验

文章目录 引言产品简介产品功能产品优势 API调用与场景实践图像增强API调用实例发票API调用实例其他场景 结语相关链接 引言 在数字化信息处理的时代,如何高效、精准地提取和结构化各类文档数据成为了企业和政府部门的重要需求。尤其是在面对海量票据、证件、表单和…

Chromium GN 目标指南 - view_example 表单示例 (八)

1. 引言 在前面的文章中,我们学习了如何创建计数器示例,了解了如何使用 Label 和 Button 控件进行交互以及更新 UI 状态。在本篇文章中,我们将创建一个更复杂的示例 —— 表单,以学习如何使用 Textfield、Combobox 和 Checkbox 等…

Linux 下 Mamba 环境安装踩坑问题汇总(重置版)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …

梳理你的思路(从OOP到架构设计)_设计模式Template Method模式

目录 1、Template Method模式 2、范例: Android TM模式 3、基于TM模式的扩充:以游戏的绘图循环(Game Loop)为例 4、Android中处处可见TM模型的应用 1、Template Method模式 在前面各节里,我们介绍过,控制反转(IoC:Inversion…

帝国CMS:如何去掉帝国CMS登录界面的认证码登录

如果在安装的时候,不小心选中了认证码选项,那么后面登录帝国后台都会要求输入认证码才能登录,如何去除这个设置呢,笔者以古诗词网 www.gushichi.com为例,为大家举例说明! 去除步骤如下: 1.前往…

STM32单片机芯片与内部47 STM32 CAN内部架构 介绍

目录 一、CAN 外设简介 二、CAN架构框图 1、CAN控制内核 (1)、主控制寄存器 CAN_MCR (2)、位时序寄存器 (CAN_BTR) 及波特率 2、CAN发送邮箱 3、CAN接收FIFO 4、验收筛选器 一、CAN 外设简介 STM32 的芯片中具有 bxCAN 控…

EasyExcel停更,FastExcel接力

11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称,官方…