39_剑指offer_java_数组中出现次数超过数组长度一半的数字

剑指offer第二版面试题39:数组中出现次数超过一半的数字(java) 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例子说明:如输入一个长度为9的数组{ 1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 。 分析1:基于Partition 函数的O(n)算法 数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序之后位于数组中间的数字一定就是... 阅读详情

目录

题目描述

测试用例

题目考点

解题思路

直接解法

HashMap解码

基于Partition函数的时间复杂度为O(n)的算法

根据数组特点找出时间复杂度为O(n)的算法

位运算解法

参考解题

补充


题目描述

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

 

测试用例

  • 功能测试(输入的数组中存在一个出现次数超过数组长度一半的数字;输入的数组中不存在一个出现次数超过数组长度一半的数字)
  • 特殊输入测试(输入的数组中只有一个数字;输入空指针)

 

题目考点

  • 考察应聘者对时间复杂度的理解。应聘者每想出一种解法,面试官都期待他能分析出这种解法的时间复杂度是多少。
  • 考察应聘者思维的全面性。面试官除了要求应聘者能对有效的输入返回正确的结果,同时也期待应聘者能对无效的输入进行相应的处理。

 

解题思路

 

直接解法

先排序,如果存在出现次数大于数组长度一半的数,那么这个数必然在n/2位置上

排序的时间复杂度为O(nlogn)

 

HashMap解码

利用HashMap来统计数字出现的次数

时间复杂度不为O(1)

 

基于Partition函数的时间复杂度为O(n)的算法

当数组中有一个数字出现的次数超过了数组长度的一半,那么这个数字一定是数组的中位数。

我们利用Partition函数找到中位数,然后判断这个数出现的次数是否真的超过数组长度的一半,如果是就输出这个数,不然就不存在超过数组长度一半的数,返回0。

代码太长,这里就不写了,可以参考之前的快速排序的Partition算法。

这种方法不好的地方是会修改输入的数组。

 

根据数组特点找出时间复杂度为O(n)的算法

首先要明确一点:如果数组中一个数字出现的次数超过数组长度的一半,那么这个数字出现的次数比其他所有数字出现的次数之和还要多。

我们可以在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是该数组出现的次数。当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1;如果下一个数字和我们之前保存的数字不同,则次数减1。如果次数为0,那么我们需要保存下一个数字,并把次数设为1,由于我们要找的数字出现的次数比其他所有数字出现的次数之和还要多,那么要找的数字肯定是最后一次把次数设为1时对应的数字。

这其实是一个投票问题,见补充。

 

位运算解法

  • 位运算:  时间复杂度o(n),但是感觉是必要不充分条件,比如[1,2,3,2,4,2,5,2,3]中没有主要元素(2出现4次,等于n/2=9/2=4),但是该方法会返回2,这是一个值得再改进的方法。具体怎么改进??遍历一次判断出现次数
public class Solution {
    // 整型数组中的主要元素
    // 位的特点
    // 对32位的每一位,如果1为多数,则主要元素该位为1,否则为0.逐位构造主要元素
    
    public int MoreThanHalfNum_Solution(int [] array) {
        // 异常
        if(array == null || array.length == 0){
            return 0;
        }
        
        int res = 0, major = array.length/2;
        for(int i = 31; i >= 0; --i){
            int pos = 0;
            for(int n: array){
                pos += (n >> i) & 1; // 第i位为1的总数 
            }
            // 多数为1则令该位为1,否则为0
            pos = pos > major?1:0;
            res |= pos << i;
        }
        if(checkMoreThanHalf(array, res)){
            return res;
        }else
            return 0;
        
    }
    
    // ----- 功能函数 ---------------------------------------
        public boolean checkMoreThanHalf(int[] array, int result){
            boolean isMoreThanHalf = false;
            int times = 0;
            
            for(int i = 0 ; i < array.length; ++i){
                if(array[i] == result){
                    times++;
                }
            }
            if(times > (array.length >> 1)){
                isMoreThanHalf = true;
            }
            return isMoreThanHalf;
        }
}

 

参考解题

 

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length == 0){
            return 0;
        }
        
        // 投票法,使用变量标记,代替删除数组中不同元素
        int result = array[0];
        int times = 1;
        
        for(int i = 1; i < array.length; ++i){
            if(times == 0){
                result = array[i];
                times = 1;
            } 
            
            if(array[i] == result){
                // 遍历元素和上次保存的结果一样,time++
                times++;
            }else{
                times--;
            }
        }
        if(checkMoreThanHalf(array, result)){
                // 调用功能函数:检查数组和结果是否满足题目条件,即result出现次数超过数组长度一半
                return result;
            }else{
                return 0;
            }
    }
    
     // ----- 功能函数 ---------------------------------------
        public boolean checkMoreThanHalf(int[] array, int result){
            boolean isMoreThanHalf = false;
            int times = 0;
            
            for(int i = 0 ; i < array.length; ++i){
                if(array[i] == result){
                    times++;
                }
            }
            if(times > (array.length >> 1)){
                isMoreThanHalf = true;
            }
            return isMoreThanHalf;
        }
}

补充

  1. Boyer-Moore Majority Vote

 

关于寻找数组中的主要元素,什么是主要元素?就是指该数在数组中出现的次数大于n/2,称为主要元素。怎么找?主流有三种方法

  • 排序后找中位数: 时间复杂度o(nlogn)
  • 位运算:  时间复杂度o(n),但是感觉是必要不充分条件,比如[1,2,3,2,4,2,5,2,3]中没有主要元素(2出现4次,等于n/2=9/2=4),但是该方法会返回2,这是一个值得再改进的方法。具体怎么改进??遍历一次判断出现次数
  • 投票: 比较直观的解释:在数组中找到两个不相同的元素并删除它们,不断重复此过程,直到数组中元素都相同,那么剩下的元素就是主要元素。思想并不复杂,但是要凭空想出这个算法来也不是件容易的事。另外,给我们的是数组,直接在里面删除元素是很费时的。取而代之,可以利用一个计数变量来实现。


     

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南 本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务 阅读详情

相关推荐

SAP VC实战:用CU01和CS02搞定BOM里的‘智能’对象相关性(附语法避坑指南)

在工业制造领域,产品配置的复杂性往往超出想象。想象一下,当客户需要定制一台工业设备时,可能有数百种配置选项相互影响——从基础材质到动力系统,从控制模块到安全装置。如何在SAP系统中优雅地管理这种复杂性?对象相关性(Object Dependencies)就是解决这一挑战的利器。

weixin_42524824的博客 467

当前数组超过一半的数字(Java)

当前数组超过一半的数字(Java) 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 代码: 方法一: public int MoreThanHalfNum_Solution(int [] array){ ...

sinat_40968110的博客 201

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策

影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊

weixin_28295799的博客 409

寻找数组中出现一半以上的数字(Java)

寻找数组中出现一半以上的数字 (牛客网—牛客题霸算法篇—NC73) 题目描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 思路 Java实现 排序法 将数组进行排序,则出现次数超过一半的数字一定会出现在数组最中间,之后统计其出现的次数,判断是否超过一半。 时间复杂度:O(nlongn) 空间复杂度:O(1) 哈希法 定义一个新的数组用来存放每个数字出现的次数; 之后遍历数组,看是否有出现次数超过一半的数字。 时间复杂度:O(n) 空间复杂度:O(n) 候选人法

ln01010的博客 855

双脉冲测试中IGBT驱动电阻和驱动电容的研究

  在LTspice中没有双脉冲波形发生器,要做一个双脉冲的波形只能用电压源来进行特殊设置,不是很方便,为此我写了一个双脉冲波形发生器,有需要的可以下载。双脉冲波形发生器。   如下,该元器件可以自定义延迟时间Td,第一个脉冲宽度T1,第二个脉冲宽度T3,两个脉冲间隔T2,脉冲循环个数Ncycle以及高低电平Vhigh,Vlow。       IGBT开通时Rg的影响: 如果增大Rg: ①开通延...

gaoyong_wang的博客 8348

基于GEC6818开发板的C/C++贪吃蛇小游戏

f.开始游戏(进入游戏,并没有马上开游戏,需要点击播放才能开始)2.相关宏,全局变量(可以根据自己需要进行修改)k.显示文字前的相关初始化。k.自定义font.h文件。1.需要的主要头文件。l.在开发板上显示字1。m.在开发板上显示字2。a.显示固定大小图片。h.线程1:获得坐标。

2301_77273301的博客 2132

求无序数组中元素出现次数超过数组长度一半的数字.

求无序数组中元素出现次数超过数组长度一半的数字. 首先给出几个"元素出现次数超过数组长度一半"测试数组: a1[7]={1 ,2, 3 , 5 , 3 , 3 , 3}; a2[5]={5, 3, 5, 5, 1}; a3[9]={8 ,5 ,6 ,5 ,4 ,2 ,5 ,5 ,1}; 不难发现: 数组中如果一个数字出现次数超过数字长度的一半.如果把这个数组排序,那么排序后...

夜微雨的博客 573

XGBoost与Embedding混合建模实战解析

在机器学习领域,特征工程与模型融合是提升预测性能的关键技术。Embedding技术通过将高维稀疏特征(如文本、ID类数据)转化为低维稠密向量,有效捕获语义关联;而XGBoost作为强大的集成学习算法,擅长处理结构化特征并进行自动特征组合。两者结合的混合架构(如Semantic Boosted Trees)在金融风控和推荐系统等场景中展现出显著优势,尤其在处理用户行为序列、商品ID等复杂特征时,相比传统方法能获得更好的模型效果。本文通过电商推荐和金融反欺诈等案例,详解如何实现Embedding+XGBoost

weixin_28718641的博客 324

找出数组中元素出现次数超过数组长度一半的元素

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 这道题有多种解法,下面主要说两种。 常规方法:创建一个Map,遍历数组中的元素,如果元素不在map中出现过,将元素设置为key,value=1,如果元素在map中,就取出这个元素,并将对应的value值+1.最后遍历map中的元素,如果有value>数组长度的一半,就返回值 思维方

一李 1020

Livox激光雷达传感器在Python3中的完整驱动程序:深入剖析OpenPyLivox库的实现和应用

当我们提到激光雷达或激光扫描技术时,Livox激光雷达传感器无疑是业界的佼佼者。尽管Livox提供了基于C++的官方软件和API,但现在,有了OpenPyLivox (OPL) 库,Python开发者们也能够轻松地接入和控制这些高级的激光雷达设备。

qq_38334677的博客 1002

〔重庆理工大学〕大学物理实验--液体表面张力系数的测定

每个老师要求不同,实验报告内容和数据仅供参考。

Pretty Boy Fox的博客 2801

找出数组中出现次数超过数组长度一半的元素

import com.google.common.base.Preconditions; /** * 问题:找出数组中出现次数超过数组长度一半的元素。 * * 解法: * 方法一:先将数组中的元素排序,由于目标元素的数量超过数组长度的一半,故排序后数组的中间元素(即数组的中位数)就是目标元素。 * 时间复杂度O(nlogn) * * 方法二:使用partition(...

java小兵 2465

64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)

qt quick-qml高德地图插件(新增:位置搜索、路径规划、轨迹编辑等) Qt地图插件,使用简单方便,不用浏览器内核,运行高效迅速 跨平台支持,(Qt Windows(MinGW, MSVC)\Linux(桌面、嵌入式)\Android\IOS\等) 在线更新瓦片地图下载,并且支持缓存保存离线地图实现.........

抵抗时间扭曲,坚持做一件有意义的事 6128

剑指offer | 面试题39:数组中出现次数超过一半的数字

转载本文章请标明作者和出处 本文出自《Darwin的程序空间》 本文题目和部分解题思路来源自《剑指offer》第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解题分析 ...

程序员大航子 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

剑指 Offer 39. 数组中出现次数超过一半的数字

剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 首先这道题我就想到了排序和map两个方法,但是排序时间复杂度高,我就使用了map解法,以下是代码 ,但是时间复杂度和空间复杂度仍然不低 public int majorityElement(int[] nums) { int len

NuanShuTT的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[剑指Offer]-数组中出现次数超过一半的数字

题目描述 数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为 9 的数组{1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2. 解题思路 当我们遍历到下一个数字的时候, 如果下一个数字和当前我们保存的数字相同,则次数加 1; 如果和当前我们保存的数字不同,则次数减 1; 当次数减到 0 的时候,我们将保存的数字...

LeoByte的编程驿站 2276

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

剑指offer面试题39(java版):数组中出现次数超过一半的数字

welcome to my blog 剑指offer面试题39(java版):数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路1 出发点:数组中出现次数超过数组长度一半的元素, 出现的次数比...

littlehaes的博客 511

【剑指 Offer 39】 数组中出现次数超过一半的数字

题目 题目链接 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题思路1 利用哈希表存储元素以及元素出现的次数,key为元素,value为元素出现的次数。如果元素出现的次数大约数组长度的一半 则输出。 代码 class Solution { public int majority

WormholeStack 963

LeetCode——剑指 Offer 39【数组中出现次数超过一半的数字】

题目 剑指 Offer 39. 数组中出现次数超过一半的数字 题目概述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 基础框架 class Solution { public int majorityElement(int[] nums) { } } 解题思路 代码详解 ...

龍弟-idea的博客 4758

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

MoreThanHalfNumber Description 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组出现了5次,超过了数组长度的一半,因此输出2. Solution 哈希表解决。在剑指offer50题的基础稍作修改即可。 Code import java.util.HashMap; impo...

Daci Studio 167

(数学) 剑指 Offer 39. 数组中出现次数超过一半的数字 ——【Leetcode每日一题】

剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

weixin_43412762的博客 687

【剑指Offer】39. 数组中出现次数超过一半的数字

NowCoder 解题思路 import java.lang.Integer; import java.util.HashMap; import java.util.*; import java.lang.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array.length == 0) return 0;

瑞新の博客:bennyrhys 1273

【剑指offer】面试题39:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 牛客网链接:https://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a921...

Java学习 501

【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字 p205 -- Java Version

剑指 Offer 39. 数组中出现次数超过一半的数字。数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

汤姆lazy的优快云博客 1126

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

剑指offer(39) 数组中出现次数超过一半的数字 package offer; import org.junit.Test; /** * 采用阵地攻守的思想:   第一个数字作为第一个士兵,守阵地;count = 1;   遇到相同元素,count++;   遇到不相同元素,即为敌人,同归于尽,count--;当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最...

小强博客 249

剑指 Offer 39. 数组中出现次数超过一半的数字【19】

根据数组特点,数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数之和还要多。因此,我们可以在遍历数组的时候设置两个值:一个是数组中的数result,另一个是出现次数times。当遍历到下一个数字的时候,如果与result相同,则次数加1,不同则次数减一,当次数变为0的时候说明该数字不可能为多数元素,将result设置为下一个数字,次数设为1。这样,当遍历结束后,最后一次设置的result的值就是符合要求的值。

m0_51697147的博客 818
上一篇: 38_剑指offer_java_字符串的排列
下一篇: 40_剑指offer_java_最小的k个数
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值