【问题描述】[简单]

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2限制:1 <= 数组长度 <= 50000

【解答思路】

1. 哈希表统计法

哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,最终超过数组长度一半的数字则为众数。此方法时间和空间复杂度均为 O(N)O(N) 。
时间复杂度:O(N) 空间复杂度:O(N)

public int majorityElement(int[] nums) {int n = nums.length;int max =1 ;int ans =nums[0];HashMap<Integer, Integer> map=new HashMap<Integer, Integer>();for(int num :nums){if(map.containsKey(num)){map.put(num,map.get(num)+1);}else{map.put(num,1);}}for(int num: map.keySet()){if(map.get(num) > max){max = map.get(num) ;ans = num;}}return ans;}
 HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {if (map.containsKey(num)) {map.put(num, map.getOrDefault(num, 0) + 1);} else {map.put(num, 1);}if (map.get(num) > nums.length / 2) {return num;}}return 0;
}
2. 摩尔投票法 最佳

核心理念为 “正负抵消”



时间复杂度:O(N) 空间复杂度:O(1)

 public int majorityElement(int[] nums) {int x = 0, votes = 0;for(int num : nums){if(votes == 0) x = num;votes += num == x ? 1 : -1;}return x;}

3. 数组排序法

将数组 nums 排序,由于众数的数量超过数组长度一半,因此 数组中点的元素 一定为众数。
时间复杂度:O(NlogN) 空间复杂度:O(1)

 public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length/2];}

【总结】

1.Java中HashMap遍历几种方式


2.HashMap常用语法

1.import java.util.HashMap;//导入;

2.HashMap<K, V> map=new HashMap<K, V>();//定义map,K和V是类,不允许基本类型;

3.void clear();//清空

4.put(K,V);//设置K键的值为V

5.V get(K);//获取K键的值

6.boolean isEmpty();//判空

7.int size();//获取map的大小

8.V remove(K);//删除K键的值,返回的是V,可以不接收

9.boolean containsKey(K);//判断是否有K键的值

10.boolean containsValue(V);//判断是否有值是V

11.Object clone();//浅克隆,类型需要强转;如HashMap<String , Integer> map2=(HashMap<String, Integer>) map.clone();

3. 一题多解 熟悉掌握一种 其他掌握思想

转载链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/
参考链接:https://blog.csdn.net/gary0917/article/details/79783713
参考链接:https://www.cnblogs.com/shoulinniao/p/11966194.html

[剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]相关推荐

  1. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

    [问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...

  2. 【剑指 offer】(二十九)—— 数组中出现次数超过一半的数字(及该数字出现的次数)

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

  3. 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找

    题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...

  4. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  5. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  6. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  7. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  8. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  9. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

最新文章

  1. 菜鸟学iPhone开发-计算器实例(实现篇)
  2. 2021年春季学期-信号与系统-第一次作业参考答案
  3. 文件还原工具Foremost
  4. 前端javascript实现二进制读写操作
  5. SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
  6. java 外部类和内部类_java – 外部和内部类方法之间的锁定和同...
  7. java Calendar的学习分享
  8. 高并发架构系列:Redis并发竞争key的解决方案详解
  9. 使用Vue做评论+localStorage存储(js模块化)
  10. 最新JAVA调用新浪微博API之发微博、发图片
  11. kms地址大全_kms激活服务器地址(常用)和自己搭建KMS服务器教程
  12. 计算机用户登录电脑蓝屏,电脑蓝屏怎么办,教您解决电脑蓝屏的方法
  13. Learn Git Branching 学习笔记(Git远程仓库篇)
  14. 【智能驾驶】汽车智能化行业深度报告
  15. Android计算标准BMI值
  16. UG8.5 正式版安装方法
  17. linux的影子系统,利用Ubuntu卸掉影子系统2008试用版
  18. React实现(Web端)网易云音乐项目(五),错过了真的可惜呀
  19. 谈谈我个人对WEB3.0对一些看法
  20. 红米Note5进入全网通5.0时代,其实是高通已经落后了!

热门文章

  1. C#判断点和直线的位置关系
  2. eclipse在ubuntu13.04下崩溃crash
  3. 对PostgreSQL中后台进程内存挂载的初步学习
  4. JS调用后台方法大全
  5. 同方专转本计算机视频,同方2011专转本计算机
  6. maven 关于使用 snapshot 的坑
  7. 第11章-img特征,vertical-align,cursor,opacity
  8. 小程序 canvas 设置 字体 字号加粗
  9. ug建模文本怎么竖着_入门到成为UG编程高手,这些步骤你不得不了解
  10. CentOS7 Ambari2.7.4编译