剑指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.如果 ...
随机推荐
- guava和redis 都是缓存用的,不过redis要起服务,guava不用起服务
guava和redis 都是缓存用的,不过redis要起服务,guava不用起服务
- C++学习笔记之指针引用
目录 指针 指针定义 左值与右值 指针数组与数组指针 const与指针 指针的指针 NULL指针 内存泄漏(Memory Leak)问题 智能指针 引用 指针 指针定义 指针定义的基本形式:指针本身就 ...
- 基于python的wav转txt的源码
最近在做一个算法的时候,用到了这个转换,这里做一个备忘,希望能给你提供价值. import wave import matplotlib.pyplot as plt import numpy as n ...
- 适合新手练习的python开源经典源码
一 前记 python学习离不开三要素: A.基础知识要熟悉 B. 练习源码要够量 C.实战项目要跟上 二 链接 书本的基础就看几本书就可以了,这里给出源码练习的经典开源源码: 该链接集合了pytho ...
- 静态类使用@Resource注解注入
工作中需要,简单记录一下 @Component public class AccountUtil { private static AccountIdDao accountIdDao; @Resour ...
- struts1标签之
<logic:iterate>主要用来处理在页面上输出集合类,集合一般来说是下列之一: 1. java对象的数组 2. ArrayList.Vector.HashMap等 具体用法请参考s ...
- Java CC链全分析
CC链全称CommonsCollections(Java常用的一个库) 梦的开始CC1 环境部署 JDK版本:jdk8u65 Maven依赖: <dependencies> <!-- ...
- javascript 把嵌套的 map 转成 object,再转 json 字符串
使用 JSON.stringify 转 map 时发现并没有转成想要的 JSON 数据,搜索发现要转成 Object 才能够转成完整的 JSON, 用递归转换: const message = new ...
- 记录--图解 Vue 响应式原理
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近部门分享,有同学提到了 Vue 响应式原理,大家在讨论时,发现一些同学对这一知识理解还不够深入,不能形成一个闭环,为了帮助大家理解这个 ...
- kali 2018.2镜像安装
本文链接来源 Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全和取证方面的相关工具.此次通过VMware虚拟机安装201 ...