昆明建设局网站号码/营销软件站
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
测试样例
样例1:
输入:
array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3
样例2:
输入:
array = [5, 5, 5, 1, 2, 5, 5]
输出:5
样例3:
输入:
array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9
步骤1:问题定义与分析
题目要求:
从一个整数数组 array
中找出某个出现次数超过数组长度一半的数字,保证这样的数字一定存在。
输入与输出:
- 输入:一个整数数组
array
,长度为n
。 - 输出:数组中某个出现次数超过
n / 2
的数字。
限制与边界条件:
- 数组中保证一定存在满足条件的数字。
- 数组长度
n
的范围未明确给出,但假设为合理范围(如1 <= n <= 10^6
)。 - 只需要输出符合条件的任意一个数字,不需要处理无解的情况。
问题性质:
- 根据题意,某个数字的出现次数超过总数的一半,称为 多数元素。
- 这种问题可以通过经典的算法(如摩尔投票法)高效解决,而不需要使用暴力计数法。
步骤2:算法设计与分析
方法1:哈希表计数
- 使用哈希表统计每个数字的出现次数。
- 遍历数组,当某个数字的出现次数超过
n / 2
时返回该数字。
时间复杂度与空间复杂度:
- 时间复杂度:O(n),需要遍历数组。
- 空间复杂度:O(n),存储哈希表。
适用场景:
适用于小规模数据,且有足够的内存空间支持额外的哈希表存储。
方法2:摩尔投票法(最佳选择)
摩尔投票法是一种高效的线性时间算法,专门用于解决多数元素问题。
算法步骤:
- 初始化一个候选值
candidate
和计数器count
为 0。 - 遍历数组:
- 如果当前计数为 0,将当前数字设置为候选值
candidate
,并将计数器设置为 1。 - 如果当前数字等于
candidate
,计数器加 1。 - 如果当前数字不等于
candidate
,计数器减 1。
- 如果当前计数为 0,将当前数字设置为候选值
- 遍历结束时,
candidate
即为多数元素。
时间复杂度与空间复杂度:
- 时间复杂度:O(n),只需遍历数组一次。
- 空间复杂度:O(1),不需要额外的存储空间。
适用场景:
适用于任何规模的数据,且是本问题的最佳解决方案。
摩尔投票法原理解释
摩尔投票法(Boyer-Moore Voting Algorithm)是一种高效的算法,用于在一个数组中找到出现次数超过一半的元素(即 多数元素)。它的核心思想是通过一种计数机制,利用元素的多数性来进行筛选,最终在 O(n) 的时间复杂度内找到目标元素,并且空间复杂度为 O(1)。
问题背景:
在一个大小为 n
的数组中,假设存在一个数字的出现次数超过 n / 2
,也就是说这个数字是多数元素。摩尔投票法的目标是找出这个元素。通过遍历数组一次并利用投票机制,我们能够在常数空间内找到这个元素。
摩尔投票法的基本原理:
-
计数器: 摩尔投票法通过维护一个计数器来识别出现次数最多的元素。这个计数器会随着遍历数组而动态调整。
-
选举过程:
- 候选人:首先,我们假设某个元素是候选人(
candidate
),并初始化计数器为 0。 - 投票规则:
- 如果当前计数器为 0,选择当前元素作为新的候选人,并将计数器设置为 1。
- 如果当前元素与候选人相同,计数器加 1。
- 如果当前元素与候选人不同,计数器减 1。
这种“投票”方式能够抵消一些非多数元素的干扰,并最终得到一个可能是多数元素的候选值。
- 候选人:首先,我们假设某个元素是候选人(
-
计数的终结: 当整个数组遍历完成后,
candidate
就是候选的多数元素。由于多数元素的出现次数超过了数组长度的一半,这个候选元素一定就是多数元素。
详细步骤:
-
初始化:
candidate
(候选元素)初始化为一个任意值。count
(计数器)初始化为 0。
-
遍历数组:
- 对于数组中的每个元素:
- 如果
count == 0
,选择当前元素作为新的候选元素,并将计数器设为 1。 - 如果当前元素等于
candidate
,则增加计数器。 - 如果当前元素与
candidate
不同,则减少计数器。
- 如果
- 对于数组中的每个元素:
-
返回结果:
- 遍历结束后,
candidate
即为数组中出现次数最多的元素。
- 遍历结束后,
直观解释:
假设数组中的多数元素出现次数超过了数组总长度的一半(n/2
)。在摩尔投票法中,元素的“投票”机制确保了最多的元素最终会“胜出”。具体来说:
- 当遇到与当前候选人不同的元素时,我们会减去一个计数,导致非多数元素的出现机会被“削弱”。
- 只有当某个元素的出现次数非常高时,才可能在整个数组中最终成为唯一的候选人。
举例说明:
假设我们有数组:[3, 3, 4, 2, 4, 4, 2, 4, 4]
。
- 第一步:
candidate = 3, count = 0
。- 看到第一个元素
3
,count = 1
,candidate = 3
。 - 看到第二个元素
3
,count = 2
,candidate = 3
。 - 看到第三个元素
4
,count = 1
,candidate = 3
(count--
)。 - 看到第四个元素
2
,count = 0
,candidate = 2
(count = 1
)。 - 看到第五个元素
4
,count = 2
,candidate = 4
。 - ...
- 遍历完成后,
candidate = 4
是多数元素。
- 看到第一个元素
为什么摩尔投票法有效?
- 由于题目保证了多数元素一定存在,并且它的出现次数超过数组的一半,因此,在摩尔投票法中,不同的元素相互“抵消”掉的次数是对等的,最终剩下的就是多数元素。
- 当计数器归零时,说明当前候选元素被其他元素“抵消”了,我们就将候选元素换成新的元素,从而不断减少非多数元素的影响,直到最后剩下的候选元素必然是多数元素。
摩尔投票法的优势
-
时间复杂度 O(n):
- 只需要遍历数组一次,因此时间复杂度是 O(n),其中 n 是数组的长度。
-
空间复杂度 O(1):
- 只使用了两个变量:
candidate
和count
,因此空间复杂度是 O(1),不需要额外的空间。
- 只使用了两个变量:
-
适用于大规模数据:
- 在大规模数据中,摩尔投票法具有很高的效率,特别是在内存和空间限制较大的情况下,能够以最优的时间和空间复杂度完成任务。
步骤3:C++ 代码实现
使用摩尔投票法解决问题:
#include <iostream>
#include <vector>using namespace std;int solution(vector<int> array) {// 摩尔投票法int candidate = 0; // 候选元素int count = 0; // 计数器// 第一次遍历,确定候选元素for (int num : array) {if (count == 0) {candidate = num; // 重置候选元素count = 1; // 初始化计数器} else if (num == candidate) {count++; // 当前数字等于候选元素,计数器加1} else {count--; // 当前数字不等于候选元素,计数器减1}}// 此时candidate即为超过一半的数字,直接返回return candidate;
}int main() {// 测试用例cout << (solution({1, 3, 8, 2, 3, 1, 3, 3, 3}) == 3) << endl; // 输出 1 (True)cout << (solution({5, 5, 5, 1, 2, 5, 5}) == 5) << endl; // 输出 1 (True)cout << (solution({9, 9, 9, 9, 8, 9, 8, 8}) == 9) << endl; // 输出 1 (True)return 0;
}
代码解释:
candidate
:记录当前的候选多数元素。count
:记录候选元素的计数。- 第一遍遍历:通过计数器逻辑,找出候选元素。
- 时间复杂度:O(n),遍历数组一次。
- 空间复杂度:O(1),无额外空间开销。
步骤4:通过解决这个问题获得的启发
- 算法设计的重要性:摩尔投票法以 O(n) 的时间和 O(1) 的空间高效解决了问题,体现了精妙的算法设计对效率的提升。
- 多数性质的利用:当一个元素出现次数超过数组长度的一半时,不需要完全统计,利用其多数性质即可快速筛选。
- 扩展应用:摩尔投票法不仅适用于确定多数元素,还可扩展到寻找多于 n/3 次出现的元素(需要两轮计数)。
步骤5:实际应用分析
实际场景:
-
舆情分析:
- 在一个讨论群中,找出被提及最多的关键词。例如,在一个由用户输入的评论数据中,快速筛选出出现频率超过一半的品牌名称或产品关键词。
- 实现方法:
- 将评论数据转化为数组形式,使用摩尔投票法筛选出最多的品牌关键词。
-
传感器数据监测:
- 在实时监测数据中,找出传感器的主流输出值,用于检测异常值。例如,某个值的输出频率异常高,可能表示系统进入了稳定状态。
-
选举系统:
- 在电子投票中,快速统计获胜的候选人(多数原则)。
实现示例:
在一个评论数据分析系统中,利用哈希表结合摩尔投票法,可以在多个评论字段中高效找出讨论最多的关键词。配合数据库或大数据平台,还可以实时生成分析报告,提升业务决策效率。
相关文章:

字节青训Marscode——8:找出整形数组中超过一半的数
问题描述 小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。 测试样例 样例1: 输入:array [1, 3, 8, 2, 3, 1, 3, 3, 3] 输出…...

C++ 异步编程的利器std::future和std::promise
1、背景 在现代计算机系统中,许多任务可能需要花费较长时间才能完成,例如网络请求、文件读取、大规模数据计算等。如果在程序中同步地执行这些任务,会导致主线程被阻塞,整个程序在任务执行期间无法响应其他操作,用户体…...

CRM 系统中的 **知识库功能** 的设计与实现
CRM 系统中的 **知识库功能** 旨在为用户提供一个集中的平台,用于存储、组织和管理有关系统功能、常见问题、使用技巧、操作文档等信息。它能够帮助用户高效解决问题、快速获取所需信息,从而提升使用体验并减少客户支持负担。 ### 一、知识库功能的设计…...

重学设计模式-工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
在平常的学习和工作中,我们创建对象一般会直接用new,但是很多时候直接new会存在一些问题,而且直接new会让我们的代码变得非常繁杂,这时候就会巧妙的用到设计模式,平常我们通过力扣学习的算法可能并不会在我们工作中用到…...

【C语言】结构体(四)
本篇重点是typedef关键字 一,是什么? typedef用来定义新的数据类型,通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二,为什么…...

swift类方法为什么使用表派发?
直接上答案:因为表派发允许子类重写父类的方法,并在运行时根据对象的实际类型调用正确的方法实现。 什么是表派发? 首先我们先知道的是,swift当中函数的派发机制主要分为静态派发和动态派发。动态派发又分为表派发和消息派发。 …...

php实现AES/CBC/PKCS5Padding加密
接口文档 文档给过来的案例是java程序的,参照其思路,造一个php版本 构造aes对称加密 public static function encry($data){$data "要加密的数据";$key 你的256位密钥; // 密钥应该是16字节(128位),24字节…...

Anaconda3安装及使用
Anaconda3安装及使用 Linux中安装Anaconda31.安装 Anaconda32.配置环境变量3.验证是否成功 Conda环境和包管理1.Conda 环境初始化2.Conda Env 管理3.Conda 软件包管理 Linux中安装Anaconda3 下面是在Linux中安装Anaconda3-2021.05的教程,其他版本Anaconda更换名字即…...

Argon2-cffi与argon2-cffi-bindings:深入理解及其应用
Argon2-cffi与argon2-cffi-bindings的关系 在Python密码学领域,argon2-cffi和argon2-cffi-bindings是两个经常被提及的库。尽管它们的名字相似,但它们在实现和用途上有所不同。argon2-cffi是一个提供Argon2哈希算法的Python库,而argon2-cffi-…...

spring boot+jpa接入达梦数据库
文章目录 前言依赖配置对应的domain类和repository 前言 最近有一个新项目,由于信息安全等要求只能使用达梦数据库(dm8),之前从来没用过,特此开一个笔记记录一下spring bootjpa如何使用达梦数据库完成开发。 依赖 p…...

Vite构建,用NodeJS搭建一个简单的Vite服务
Vite 是一个现代的前端构建工具,由 Vue.js 作者尤雨溪创建。它主要用于开发和构建现代 JavaScript 应用,尤其是单页应用(SPA)。Vite 相比于传统的构建工具(如 Webpack)有几个显著的优势: 即时开…...

R语言机器学习论文(六):总结
文章目录 介绍参考文献介绍 本文采用R语言对来自进行数据描述、数据预处理、特征筛选和模型构建。 最后我们获得了一个能有效区分乳腺组织的随机森林预测模型,它的性能非常好,这意味着它可能拥有非常好的临床价值。 在本文中,我们利用R语言对来自美国加州大学欧文分校的B…...

python---面向对象---综合案例(4)
案例描述 实现加减乘法运算 # _*_ encoding:utf-8 _*_# 计算器, 实现一些基本的操作, 加减乘除运算, 以及打印结果操作# ------------------------------------代码1-------------------------------------- def jia(n1, n2):return n1 n2def jian(n1, n2):return n1 - n2de…...

如何参加华为欧拉考试?
华为欧拉考试主要针对的是华为欧拉(EulerOS/openEuler)操作系统的认证考试,这一认证体系旨在培养和认证具备基于欧拉操作系统进行企业级应用运行基础环境搭建、管理和调测能力的工程师以及云计算架构师。以下是对华为欧拉考试的详细介绍&…...

算法预刷题Day9:BM28 二叉树的最大深度
描述: 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量。 最大深度是所有叶子节点的深度的最大值。 (注:叶子节点是指没有子节点的节点。) 思路: 当前节点的最大高度 ma…...

exp_lr_scheduler理解
1. exp_lr_scheduler理解 这行代码定义了一个学习率调度器,用于动态调整训练过程中优化器的学习率。让我们分解并解释其含义: 1. exp_lr_scheduler 是什么? exp_lr_scheduler 是一个 学习率调度器(LR Scheduler),由 torch.optim.lr_scheduler.StepLR 创建,旨在按照预…...

Algorithm:河内之塔
1. 说明 河内之塔(Towers of Hanoi)是法国人 M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas 曾提及这个故事,据…...

集中管理与实时审计:构建Linux集群(1300台服务器)日志平台的最佳实践
简介 随着企业IT基础设施的不断扩大,Linux服务器的数量也日益增多,传统的单机日志管理方式已无法满足对日志数据集中管理、审计和分析的需求。尤其是在大型集群环境中,如何高效地收集、存储和分析日志成为了一项重要的技术挑战。 背景 在实…...

在Scala中Array不可变的学习
package gjhs114import scala.collection.mutable.ArrayBuffer object Arrray114 {// 不可变数组:Array// def main(args: Array[String]): Unit {1 创建不可变数组// val arr1 Array(1,2,3)//2 访问.数组名(下标)。下标是从0开始到…...

vue3+vite 批量引入组件动态使用
import { ref, reactive, toRaw, markRaw, defineAsyncComponent, onMounted } from vue import type { Component } from vue// vue3vite 批量引入组件动态使用 const modules import.meta.glob<Component>(./details/*.vue) // 明确指定导入的模块类型为Component con…...

设计模式——方法链or流式接口
方法链或流式接口是一种编程模式或设计模式。核心思想是通过返回对象自身的应用,使得可以在一个表达式中连续调用多个方法。 c中实现这种模式 1.基本语法规则 (1)每个可链接的方法都返回对象自身的引用(通常是*this)…...

JAVA OPCUA 服务端开发,客户端连接会话监听和订阅事件监听
前言 关于使用milo开源库,开发opc ua服务器,有网友咨询如何设置服务端如何监听客户端的连接或断开事件,如何监听客户端发起订阅事件的代码实现,于是我完善了这部分的空缺整理整了这篇教程,希望能解决有同样需求,但是遇到困难的网友!因为milo没有官方文档的教程且网上详…...

pytest相关总结
1.pytest -v -s -v将测试用例名称和用例中的输出进行展示,将每条用例脚本的内容逐行进行结果展示; -s 参数是为了显示用例执行层级的打印信息 pytest使用总结笔记 - fengf233 - 博客园 2....

cin/cout的性能优化和缓冲区同步问题
目录 背景导入 问题 1.1ios::sync_with_stdio(false) 1.2为什么要解除C/C IO流同步? 1.3使用场景 2.1cin和cout的绑定关系 2.2为什么要解除绑定关系? 2.3注意事项 背景导入 大家可以先看一下这段背景知识;后面我会谈谈自己的理解; 1.在C中,标准输⼊输出流…...

redisson-spring-data与Spring-Data-Redis的版本关系问题
redisson-spring-boot-starter https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter https://github.com/redisson/redisson/tree/master/redisson-spring-data#spring-data-redis-integration 将 Redisson 与 Spring Boot 库集成。依赖于Spring…...

Puppeteer代理认证的最佳实践和示例
在现代网络环境中,代理服务器的使用越来越普遍,尤其是在数据抓取、网页自动化测试和网络监控等领域。Puppeteer作为一个流行的Node库,它提供了高级的API来控制Chrome或Chromium浏览器。在某些情况下,我们需要通过代理服务器来执行…...

js 字符串 只显示数字
1. 使用正则表达式的match方法 原理:正则表达式\d用于匹配一个或多个数字。match方法会在字符串中查找与正则表达式匹配的部分,并返回一个包含所有匹配结果的数组。示例代码: let str "abc123def456"; let numbers str.match(/…...

STM32标准库-FLASH
FLASH模仿EEPROM STM32本身没有自带EEPROM,但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间,和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大,SPI 时钟最高可以到 37.5Mhz,支持 DMA,可以配置为 SPI协…...

PowerShell:查找并关闭打开的文件
Get-SmbOpenFile 打开 Windows PowerShell 并运行 Get-SmbOpenFile | Format-List 若要仅显示特定文件共享的连接,请使用 Where-Object 运行 Get-SmbOpenFile。 Get-SmbOpenFile | Where-Object Path -eq "C:\Data\" | Format-List Get-SmbSession 显…...

【AI系统】昇腾异构计算架构 CANN
昇腾异构计算架构 CANN 本文将介绍昇腾 AI 异构计算架构 CANN(Compute Architecture for Neural Networks),这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持,旨在提供…...