题⽬描述

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

思路及解答

哈希表法(HashMap)

哈希表法通过统计每个数字的出现次数来解决问题。遍历数组时,使用哈希表记录每个数字出现的次数,一旦发现某个数字的出现次数超过数组长度的一半,立即返回该数字。

public class Solution {
public int MoreThanHalfNum(int[] nums) {
// 创建哈希表,key为数字,value为出现次数
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
// 获取当前数字的出现次数并加1,若不存在则初始化为0再加1
int count = map.getOrDefault(num, 0) + 1;
// 若当前数字出现次数已超过数组长度一半,则返回该数字
if (count > nums.length / 2) {
return num;
}
map.put(num, count); // 更新哈希表
}
return 0; // 如果不存在多数元素,返回0(但题目假设总是存在)
}
}
  • 时间复杂度​:O(n),其中 n 是数组的长度。我们只需遍历数组一次。
  • 空间复杂度​:O(n),最坏情况下需要存储所有不同的数字。

排序法

排序法的思路非常巧妙:​由于多数元素的数量超过数组长度的一半,那么将数组排序后,中间位置的元素一定是多数元素。

public class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums); // 对数组进行排序
return nums[nums.length / 2]; // 返回中间位置的元素
}
}

摩尔投票法(Boyer-Moore Voting Algorithm)

  1. 如果使⽤ hashmap 直接统计,需要额外的空间,我们不希望使⽤额外空间;
  2. 如果使⽤排序之后再统计,需要时间复杂度为O(nlogn), 我们希望时间复杂度更低⼀点。

摩尔投票法是一种高效且空间复杂度低的算法。其核心思想是通过票数的抵消来找出多数元素。算法维护一个候选众数 candidate 和其票数 count。遍历数组时,若 count 为0,则选择当前数字作为候选;若当前数字与候选相同,则票数加1,否则减1。由于多数元素的存在,最终剩下的候选一定是多数元素。

public class Solution {
public int majorityElement(int[] nums) {
int candidate = 0; // 候选众数
int count = 0; // 票数统计 for (int num : nums) {
if (count == 0) { // 如果票数为0,选择当前数字作为候选
candidate = num;
}
// 如果当前数字与候选相同,则票数加1,否则减1
count += (num == candidate) ? 1 : -1;
} // 可选:验证candidate是否真的是多数元素(根据题目假设,通常不需要)
// 但如果题目要求不存在多数元素时返回0,则需要验证步骤
count = 0;
for (int num : nums) {
if (num == candidate) count++;
} return count > nums.length / 2 ? candidate : 0;
}
}
  • 时间复杂度​:O(n),只需遍历数组两次(一次投票,一次验证)。
  • 空间复杂度​:O(1),只使用了常数个额外变量

剑指offer-28、数组中出现次数超过⼀半的数字的更多相关文章

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

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  2. 《剑指offer》数组中出现次数超过数组长度一半的数字

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

  3. 【剑指offer】数组中出现次数超过数组长度一半的数字,C++实现

    原创博文,转载请注明出处! # 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

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

    [思路]将每个数字都存入map中作为key值,将它们出现的次数作为value值,当value超过一半时则返回其key值. class Solution { public: int MoreThanHa ...

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

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  6. 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法

    剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...

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

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

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

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  9. 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)

    [剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...

  10. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

随机推荐

  1. java类型转换的例子

    Java中数据类型自动转换优先级 犹由于java是强类型语言,所以进行一些运算的时候,必须进行类型转换运行中不同类型数据先转为同一类型再进行运算 /*注意点:1.不能对布尔值进行转换2.不能把对象类型 ...

  2. C# 关于 &符号,字符串转字典Dictionary<string, string>

    private static Dictionary<string, string> ParseToDictionary(string str) { Dictionary<string ...

  3. 最新VMware Workstation虚拟机下载并安装

    [2025年]最新VMware Workstation虚拟机下载并安装 1.最新VMware Workstation下载地址 2024年5月5日之后,VMware workstation不能直接在vm ...

  4. electron-builder 在打包universal的时候报错 both x64 and arm64 builds and not cover

    ⨯ Detected file "Contents/Resources/src/files/adbtool/mac/adb" that's the same in both x64 ...

  5. Burp Scanner 使用指南:爬虫与漏洞检测全流程解析

    前言 在 Web 渗透测试中,Burp Suite 不仅是一款功能强大的抓包工具,还内置了全面的漏洞扫描模块 -- Burp Scanner.它通过内置的爬虫(Crawler)自动构建网站结构,并结合 ...

  6. 有100块石头, A和B交替拿, 每人一次拿1-5块, 如果A先拿, 第一次拿几块能保证最后能赢

    简介 其实这题可以分成 A | B A | B A ...| B A A第一次拿取x个 然后, 剩下B A 每次拿去一定要大于6等于6个. 如果 B A 拿取6个的话, 推出 第一次 拿取4个. 如果 ...

  7. opengl 学习 之 09 lesson

    opengl 学习 之 09 lesson 简介 顶点序列化? 思想简单来说,就是如果近似的点,使用同一个点,如果不是近似的点就增加点. link http://www.opengl-tutorial ...

  8. java jFrame

    简介 java核心编程示例代码 code /* * @Author: your name * @Date: 2020-10-28 17:06:45 * @LastEditTime: 2020-10-2 ...

  9. 交叉注意力机制在YOLO目标检测优化中的应用:结合余弦退火学习率调度的实战解析

    在目标检测领域,YOLO(You Only Look Once)因其高效性和准确性而被广泛采用.然而,随着任务复杂性的提升,如何优化 YOLO 算法以实现更高的性能成为研究热点.本文探讨了交叉注意力机 ...

  10. Django 实战:静态文件与媒体文件从开发配置到生产部署

    一.静态文件与媒体文件 区别与联系 在 Django 项目中,静态文件(Static Files)和媒体文件(Media Files)是两种不同类型的文件,需要不同的处理方式. 特性 静态文件 (St ...