算法题:数组中出现超过一半的数字 题目分析

【搞定算法】找出数组中出现次数大于数组长度一半和 N/K 的数 博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验。 目 录: 1、找出数组中出现次数大于数组长度一半的数 2、找出数组中出现次数大于数组长度 N/K 的数 1、找出数组中出现次数大于数组长度一半的数 一个数组中出现次数大于数组长度一般的数显然最多只有一个。 题目:在数组中找到出现次数大于数组长度一半的数。... 阅读详情

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

题目分析

由于出现某个数字a,占数组超过了一半,若数字a与其他数字相互抵消,至少也能剩下1个数字a,所以可以采用这样的方法:先记住第一个数字,初始化一个count,后面遍历如果是相同的数字就使count增加(相同数字叠加),若不同则count减少(不同数字相互抵消),如果count变为0,则不再记住这个数字,重新记住下一个,如:
1,2,3,2,2,2,5,4,2
1:首先记住1,count = 1
2:与记住的1不相同,count较少为0,舍弃记住的1
3:重新记住3,count = 1
2:舍弃3,count = 0
2:记住2,count = 1
2:与记住的相等,count = 2
5:不相同,count = 1
4:不相同,count = 0 ,舍弃2
2:重新记住2,count = 1
这样就得到了2

如果count = 0,说明没有任何一个数是超过了一半的,一定没有答案
如果count = 1,可能有答案 ,因为不同数字之间会相互抵消 ,得到的数字,并非一定是超过一半的,如:1,2,3,4,5 会得到5,但5并不是满足要求的 答案。
这时只要将得到的数字回到数组中检查一遍,看看个数是否满足要求即可 。
整个算法时间复杂度为o(n)

代码实现

public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length == 0){
            return 0;
        }
        int count = 0;
        Integer num = null;//-1 不指向任何数
        for (int i = 0; i < array.length; i++) {
            if(array[i] == num){
                count++;
            } else if(num == null){ //重新指向一个
                num = array[i];
                count++;
            } else{
                count--;
                if(count == 0){ //消除指向
                    num = null;
                }
            }
        }
        if(count == 0) { //count == 0,一定没有满足要求的
            return 0;
        } else { //可能有,需要对num精确检查
            int numCount = 0;
            for (int i : array) {
                if(i == num)
                    numCount++;
            }
            if(numCount > array.length/2)
                return num;
            else
                return 0;
        }
    }
SXU—软件测试方法和技术-朱少民-第三部分 软件测试方法大题汇总-附考点和相关习题及解答 软件测试方法和技术-朱少民-第三部分 软件测试方法—-最少测试用例个数,强一般弱一般强健壮、边界值分析、ns流程图、白盒逻辑覆盖代码、等价类划分,逻辑组合(条件)覆盖,计算圈复杂度等—附考点和相关习题及解答 阅读详情

相关推荐

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战

本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。

weixin_29309213的博客 116

用一个简单的方法获取一个数组中出现次数超过一半的元素

用一个简单的方法获取一个数组中出现次数超过一半的元素 突然想到写这个的原因是笔试中遇到一个比较相似的题,随便写了些,有什么问题可以底下评论反馈我,谢谢。 主要思路是利用sort方法去排序获取位于中间的元素,然后在遍历统计该元素出现的次数,若超过数组长度的一半,则输出该元素,否则输出-1. import java.util.Arrays; import java.util.Collections; ...

鱼会喷水的博客 447

JW01二氧化碳传感器实战:5分钟搞定Arduino环境监测系统(附完整代码)

本文详细介绍了如何使用JW01二氧化碳传感器与Arduino快速搭建环境监测系统。通过简单的硬件连接和完整的代码示例,读者可以在5分钟内实现CO2浓度实时监测,并了解数据解析、常见问题解决及进阶应用扩展。JW01传感器的高精度和易用性使其成为创客和嵌入式开发者的理想选择。

kite3的博客 382

LeetCode刷题(183)~数组中出现次数超过一半的数字【摩尔投票法】

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解答 By 海轰 运行结果 int majorityElement(vector<int>& nums) { int count=0; int a; for(i

海到无边天作岸 山登绝顶我为峰 2298

LangGraph 中 Human-in-the-loop

摘要:本文探讨了在自主AI Agent系统中实现"人工介入关键节点"(HIL)的技术方案,主要基于LangGraph框架构建。针对Agent可能执行高风险操作(如删除数据库)的问题,提出通过断点机制在关键节点暂停流程,实现人工审批后再继续执行。具体实现包括:(1)使用checkpointer组件持久化状态;(2)通过interrupt_before/after参数设置断点;(3)支持三种交互模式:批准、编辑和输入。文章还提供了代码示例,展示如何在不同场景(如工具调用)中动态触发人工审核机

qq_52053775的博客 153

【逐函数讲解ORB_SLAM3源码】获取普通帧率、关键帧、IMU数据

获得imu的旋转 mRwc * mImuCalib.mTcb.rotationMatrix(); Sophus::SE3 mTwc 创建ORB_SLAM3系统 Create SLAM system. It initializes all system threads and gets ready to process frames. ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::IMU_RGBD, true, 0, file_nam

小秋 AI SLAM 入门实战教程 1245

牛客题目:在数组中找出出现次数大于一半的数

题目描述 给定一个整型数组arr,请打印其中出现次数大于一半的数,如果没有这样的数,请输出-1。 示例 输入: 5 11 7 5 7 7 输出: 7 算法思想 1.给数组进行排序 2.定义count计数字出现的次数,遍历数组,从数组第一个数开始与最中间的数进行比较,若相等,则count每次加1 3.若count的值大于数组最中间的数字下标,则输出最中间的数字,否则输出-1。 代码 import j...

流年、烟雨 1408

[DDR5]DDR5 SDRAM 状态图 和 基本功能

DDR5 SDRAM的读写操作以突发(burst mode)为导向,从选定的位置开始,并按照编程顺序进行16个突发长度或8个“切片”突发长度的操作。从ACTIVATE命令开始,然后是读取或写入命令。

串起点滴 1200

【五种方法解决】找出数组中出现次数超过数组长度一半的数字

剑指offerJZ28:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 这道题是在面试时常问的一道题,有多种解法,我们分别看一下; 方法一:利用map 利用map的key -value模型来存放arr[i]和相对应出现的次数,最后用次数去跟数组长度一半去比较,大于则就是;比如1,2,3,2,2,2,5,4,2;就是1出现一次、2出现5次、3.4.

chris__x的博客 1万+

复现论文《Analysis of circulating current mechanism of Grid-forming offshore wind farm based on DRU-HVDC》

该论文研究了基于二极管整流单元(DRU)和低频交流(LFAC)输电的构网型(GFM)海上风电场并网系统中环流的产生机理。由于 DRU 不可控,系统电压与频率依赖于风力发电机(WT)的网侧变流器,当多台 WT 并联运行时,因输出电压幅值、相位、输出阻抗或频率不匹配,会产生基频环流,导致系统损耗增加与稳定性下降。论文通过理论建模与 MATLAB/Simulink 仿真,分析了四种不平衡工况下的环流机理,并指出幅值不平衡和阻抗不平衡引起无功环流,相位不平衡引起有功环流,频率不平衡则引起环流振荡,为后续环流抑制研究

huanghm88的专栏 104

国产系统(统信 UOS )漏洞修复方式

2.1 服务器版(单漏洞更新):服务器标准版:yum upgrade-minimal --cve “CVE编号”服务器 D 版:sudo apt update&&sudo apt install “受影响的软件包”1 统信 UOS 漏洞修复方式在线升级修复桌面专业版:通过以下步骤打开在线升级:控制中心–>更新–>更新设置–>打开系统更新、安全更新。安装过程中,请勾选“我已阅读并知晓”,然后点击“开始升级”。2 点击“检查更新”–“全部下载”,如果不想进行系统更新,可以选择只下载“安全更新”。

Reyn_观极 5012

数组中有一个数字出现的次数超过数组的一半,请找出这个数字。

方法(1):用一个count数组记录数组中元素出现的次数(哪个数字出现了,将以这个数字为下标的count数组元素加1,也可以优化以下,即空间开max-min+1这么大,即如果最小的元素出现了,将count下标为0的元素加1,但是当原数组元素范围很大时,这种方法还是比较坑爹).当然这个可以优化到直接用map,元素与次数的映射,而不是自己去统计。 方法(2):可以将数组进行排序,排好序后,中间...

lyl194458的博客 1284

跨应用服务器的自定义 IDoc 传输实战:以 CATSDB 工时为例,打通两套 SAP 系统的数据通道

本文介绍了在企业多SAP系统环境下,使用SAP ALE/IDoc技术实现工时数据跨系统传输的解决方案。文章从技术选型、系统架构到具体配置步骤进行了详细说明,重点阐述了IDoc/ALE在异步传输、全链路追踪和数据重放方面的优势。 文章详细讲解了端到端实施流程,包括Logical System配置、RFC Destination创建、Message Type定义、Segment和Basic Type设计等关键步骤。同时提供了出站封装的ABAP代码示例,强调调用MASTER_IDOC_DISTRIBUTE函数后执

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

剑指offer算法题028:数组中出现次数超过一半的数字

小编在求职找找工作期间剑指offer上的算法题刷了很多遍,并且每道题小编当时都总结了一种最适合面试时手撕算法的最优解法。考虑到剑指offer算法题在面试中的高频出现,小编每天和大家分享一道剑指offer上的算法题,以及小编总结的答案。下面是第028道剑指offer算法题: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 分析 比较有意思

我的博客 458

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

每日一道算法题:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过了数组长度的一半,因此输出2。 解题思路:如果某个数字在数组中出现的次数超过了数组长度的一半,我们将数组排序后,数组中间的数字必为次数。按照这种思路,我们先将数组排序,再直接输出数组中间的数即可,代码如下: #include

jhyxss的专栏 679

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

剑指offer:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输

剑指offer算法题 分治 位运算 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 题目分析 如果直接暴力求解也是可以有解,但是时间复杂度为O(n2),我们的目标是将时间复杂度降为O(n)。 思路:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。(这种方法前提条件一定是数字出现的次数过半!) 在遍历数组时保存两个值

gaozhuang63的博客 483

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

NowCode JZ39 数组中出现次数超过一半的数字 简单

哈希映射

分享简单技术,记录点滴成长 328

数组中出现次数超过一半的数字(第28题)

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 ac:100% import java.util.HashMap; import java.util.Map.Entry; public class A28数组中出...

玉爷的博客 121

数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 分析 巧解 哈希表(面对这一类问题的通解) 代码 /*巧解*/ public class Solution { public int MoreThanHalfNum_...

BluthLeee的博客 125

算法题——求数组中元素出现次数超过数组长度的一半

思路:先排序,然后将第n个元素和第n+k/2个元素比较;若相等则存在,若不相等则不存在 请看下面代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void M_Half(int arr[], int k) { int i = ...

belongHWL的博客 316

剑指offer(28)数组中出现次数超过一半的数字

(19.2.12) 剑指offer(28)数组中出现次数超过一半的数字 状态开始回来可以开始写算法题了。 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 这题较简单,可以用“分形叶”的思想,但我做的时候没考虑那么多,用了个笨办...

阿洪的博客 250

剑指 Offer 39. 数组中出现次数超过一半的数字 - leetcode 剑指offer系列

题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题估计大家或多或少都见过, 这里就来复习下做法吧, 重点是要理解为什么这样做是可行的 老样子晚上 6 点 45 分准时更新公众号 每日精选算法题, 大家记得关注哦~ 另外在公众号里回复 offer 就能看到剑指 offer 系列当前连载的所有文章了 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 1 <= 数组长度 <= 500.

随便发挥的博客 398

【Java面试题】数组中出现次数超过一半的数字

【题目】: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 【示例】: 将数组排序,如果符合条件的数存在,则一定是数组中间那个数。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等),这种方法虽然容易理解,但由于...

cungudafa的博客 451

剑指offer 数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 这道题目使用经典的摩尔投票法解决,由于不保证一定出现答案,最后在check一遍答案,时间复杂度O(n), 空间复杂度O(1) // 维护两个变量 // 摩尔投票法 ...

wwxy1995的博客 122

算法:数组中出现次数超过一半的数字

学习算法,不仅能让自己思维能力更是一个台阶,也能在大数据和人工智能时代为自己打下坚实的基础,成为互联网行业的高端人才,而不是一直停留在低水平的体力编程层次。

孤芳不自赏 264

剑指offer之一—数组中出现次数超过一半的数字

文章目录问题描述方法一:给数组排序方法二:桶排序计数方法三:巧用栈方法四:找中位数(第n/2大数) 用头脑风暴学算法,对于一个问题,我们不只是要解决它,还要去思考有什么好的方法,差的方法去解决,甚至是一些错误的但可以提供思想借鉴的方法。 此问题“数组中出现次数超过一半的数字”是一道非常经典的算法题,我把它放在算法风暴系列第一篇来解析,探讨学习一个算法的过程,从慢到快,从最直观的方法到脑洞大开的方法...

姬小野的博客 2009
上一篇: V-Viewer常见用法和隐藏img标签或img标签不直接在<viewer>下
下一篇: 算法题:连续子数组的最大和,分析过程(动态规划)
Baibair
博客等级 码龄8年 3粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值