剑指offer39(Java)-数组中出现次数超过一半的数字(简单)
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
1 <= 数组长度 <= 50000
注意:本题与 力扣169 题相同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:哈希表
创建一个哈希表,遍历数组,用哈希表记录每个数字出现的次数,就可找出出现次数大于一半的数字。
1 class Solution {
2 public int majorityElement(int[] nums) {
3 int n = nums.length;
4 Map<Integer, Integer> map = new HashMap<>();
5 for(int num : nums){
6 map.put(num, map.getOrDefault(num,0)+1);
7 if(map.get(num) > (n / 2)){
8 return num;
9 }
10 }
11 return 0;
12 }
13 }
小知识:
Map.getOrDefault(Object key, V defaultValue);
如果在Map中存在key,则返回key所对应的的value。
如果在Map中不存在key,则返回默认值。
例如:
map.put( num, map.getOrDefault(num, 0) + 1 )
①map中含有num的话,就将num对应的value值+1
②map中不含有num的话,num对应的value对应的默认值赋值为0,然后再+1
方法二:排序
题目中给了一定存在一个数字出现的次数超过数组长度的一半,故排序后,出现次数最多的数就在排序后数组的中间位置。
1 class Solution {
2 public int majorityElement(int[] nums) {
3 Arrays.sort(nums);
4 return nums[nums.length / 2];
5 }
6 }
方法三:摩尔投票法
“假设数组中每个不同的数字就代表每一个国家,而数字的个数就代表这个国家的人数,他们在一起混战,就是不同国家之间每两个人数同归于尽。我们就可以知道哪个人数大于数组长度一半的肯定会获胜。”
详情可以看:K神老师的题解
思路:
①初始化: 票数统计 sum = 1 , 众数 vit_num为数组第一个元素;
②循环: 从第二个数开始遍历数组 nums 中的每个数字 num ;
- 当 票数 sum 等于 0 ,则重新赋值sum = 1,且假设当前数字 nums[i] 是众数;
- 当 当前元素nums[i] == vit_num 时,票数 sum 自增 1 ;当 nums[i]!= x 时,票数 sum自减 1 ;
③返回值: 返回 vit_num 即可;
假设数组中不存在占一半以上的数字呢?
就需要加入一个 “验证环节” ,遍历数组 nums 统计 vit_num 的数量。
- 若 vit_num 的数量超过数组长度一半,则返回 vit_num ;
- 否则,返回未找到众数;
1 class Solution {
2 public int majorityElement(int[] nums) {
3 int n = nums.length,sum = 1;
4 int vit_num = nums[0];
5 for (int i = 1; i < n; i++){
6 if (sum == 0){
7 sum = 1;
8 vit_num = nums[i];
9 }else if (nums[i] == vit_num){
10 sum++;
11 }else{
12 sum--;
13 }
14 }
15 return vit_num;
16 }
17 }
剑指offer39(Java)-数组中出现次数超过一半的数字(简单)的更多相关文章
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...
- 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...
- 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)
[剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...
- 【Java】 剑指offer(39) 数组中出现次数超过一半的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如 ...
- Go语言实现:【剑指offer】数组中出现次数超过一半的数字
该题目来源于牛客网<剑指offer>专题. 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 《剑指offer》-数组中出现次数超过一半的数字
/* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果 ...
随机推荐
- react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁
react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁 let imageTopBg if (imgSrcBg) { c ...
- 新版idea配置maven注意点!!
1. maven配置 首先是按要求配置了maven,关闭所有项目->自定义->所有设置 配置完成之后发现新建项目下方还是显示从官方源下载maven包装器,而且在项目中出现这个配置文件 可以 ...
- 逆向通达信Level-2 续四 (调试level2数据接口)
逆向通达信Level-2 续十一 (无帐号登陆itrend研究版) 逆向通达信Level-2 续十 (trace脱壳) 逆向通达信Level-2 续九 (无帐号打开itrend研究版) 逆向通达信Le ...
- C 可变参数函数分析(va_start,va_end,va_list...)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 8、Linux CentOS 安装.Net Core 3.1
1.添加密钥 将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库. 打开终端并运行以下命令: sudo rpm -Uvh https://packages.m ...
- 检验实时3D像素流送平台好坏的七个标准!(下)
上篇文章我们介绍了<检验实时3D像素流送平台质量的七个标准>中的前四个标准,本文我们将继续给您介绍检验像素流送平台质量的其他三个标准. 您的平台是通过云还是仅通过渲染的图像传输数据? 您的 ...
- 【干货】Java开发者快速上手.NET指南
前言 前几天有小伙伴在技术群里发了一个微软官方出的:适用于Java开发人员的.NET快速入门免费电子书,今天大姚来分享一下Java开发者想要快速上手.NET有哪些教程和优质资料. 微软适用于Java开 ...
- java DES 加密和解密
代码如下 import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESK ...
- 超越极限!80Gbps高速传输,让您的数据瞬间飞速传递
大文件传输是很多企业面临的挑战之一.基于传统的文件传输方法,由于许多原因,例如网络拥塞.数据包丢失.传播延迟等,导致文件的传输速度较慢.不稳定或不安全.尤其是对于像科研机构.金融公司和媒体制作公司等需 ...
- OREPA:阿里提出训练也很快的重参数策略,内存减半,速度加倍 | CVPR 2022
论文提出了在线重参数方法OREPA,在训练阶段就能将复杂的结构重参数为单卷积层,从而降低大量训练的耗时.为了实现这一目标,论文用线性缩放层代替了训练时的BN层,保持了优化方向的多样性和特征表达能力.从 ...