剑指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.如果 ...
随机推荐
- float、double的精度、范围,在内存中的存储方式
float.double的精度,在内存中的存储方式 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R3 ...
- Spring boot返回时间与MySql数据库中不相同问题及解决方法
最近做项目测试的发现,访问Url返回的时间与数据库中的不相同,环境是Spring boot+MyBatis+Mysql(阿里云服务器),经过一番折腾,得到了解决 问题描述 我是直接使用IDEA的数据库 ...
- 应急响应靶机训练-Linux2
靶机来源: 知攻善防实验室公众号 https://mp.weixin.qq.com/s/xf2FgkrjZg-yWlB9-pRXvw 我是在另一台主机上通过ssh连接到靶机进行解题的,我的ip为192 ...
- 用cmd检查端口关闭命令
1.进入cmd 2.netstat -o -n -a | findstr :8080 TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116 3.taskkill /F / ...
- async/await 与console(C#)
问题: 上一篇async/await 致WPF卡死问题(https://www.cnblogs.com/stephen2023/p/17725159.html),介绍主线程阻塞,async/await ...
- 电影数据集【可供机器学习附爬虫源码】(豆瓣、爱奇艺、IMDB、腾讯视频等)
电影数据集(豆瓣.爱奇艺.IMDB.腾讯视频.搜狐.1905) 爬虫爬取豆瓣.爱奇艺.IMDB.腾讯视频.搜狐.1905网,电影数据. 获取方式:微信搜索关注[靠谱杨阅读人生]回复[电影]. 整理不易 ...
- Flume入门操作
十一.Flume 1)开启Flume的监控端口 bin/flume-ng agent -c conf/ -n a1 -f job/flume-netcat-logger.conf -Dflume.ro ...
- SQLite数据库(来自菜鸟教程)
SQLite是什么?为什么要用SQLite?SQLite有什么特点? 答:下面请听小猪娓娓道来: ①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标 ...
- 机器语言编写helloworld
kvmtool下载编译 git clone https://github.com/kvmtool/kvmtool.git 下载后进入到目录执行make即可. 补码 计算机怎么表示负数?以四位有符号数为 ...
- 2 JavaScript的基础类型
2 JavaScript的基础类型 JS虽然是一个脚本语言. 麻雀虽小, 五脏俱全. 在js中也是可以像其他编程语言一样. 声明变量, 条件判断, 流程控制等等. 我们先看一下JS中的数据类型 在js ...