剑指Offer-数组中出现次数超过一半的数字
时间:2022-05-11
本文章向大家介绍剑指Offer-数组中出现次数超过一半的数字,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
思路一:
利用HashMap记录每个数字以及数字出现的次数,没出现过的就放进去,出现过的就累加,若出现次数大于长度一半,返回此数,否则返回0。
思路二:
利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题
使用 count 来统计一个元素出现的次数,当遍历到的元素和统计元素不相等时,令 count--。如果前面查找了 i 个元素,且 count == 0 ,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 count 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。
代码实现
package Array;
import java.util.HashMap;
/**
* 数组中出现次数超过一半的数字
* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
*/
public class Solution42 {
public static void main(String[] args) {
Solution42 solution42 = new Solution42();
int[] array = {1, 2, 3, 2, 2, 2, 5, 4, 2};
System.out.println(solution42.MoreThanHalfNum_Solution_2(array));
}
/**
* 利用 Boyer-Moore Majority Vote Algorithm(摩尔投票算法)来解决这个问题
*
* @param array
* @return
*/
public int MoreThanHalfNum_Solution_2(int[] array) {
int majority = array[0];
for (int i = 1, count = 1; i < array.length; i++) {
count = array[i] == majority ? count + 1 : count - 1;
if (count == 0) {
majority = array[i];
count = 1;
}
}
int count = 0;
for (int val : array) if (val == majority) count++;
return count > array.length / 2 ? majority : 0;
}
/**
* 利用HashMap记录每个数字以及数字出现的次数
*
* @param array
* @return
*/
public int MoreThanHalfNum_Solution(int[] array) {
if (array == null || array.length == 0)
return 0;
HashMap<Integer, Integer> map = new HashMap<>();
int count;
for (int val :
array) {
if (!map.containsKey(val)) {
map.put(val, 1);
} else {
count = map.get(val);
map.put(val, ++count);
}
if (map.get(val) > array.length / 2) {
return val;
}
}
return 0;
}
}
- OutOfMemoryError异常系列之Java堆溢出
- android ndk之hello world
- ScheduledExecutorService和timer的异同
- 【精心解读】关于Jupyter Notebook的28个技巧
- Web项目接口自动化测试框架搭建
- 一文读懂Hadoop、HBase、Hive、Spark分布式系统架构
- 《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld
- Java9中的GC调优基础
- javascript深入理解js闭包
- https连接的前几毫秒发生了什么
- android自定义view实现progressbar的效果
- 还是不靠谱!多维LSTM网络预测比特币价格【机器学习应用区块链系列二】
- picasso图片缓存框架
- Git基础和规范-协同开发
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android编程之绘图canvas基本用法示例
- Android 编译出错版本匹配问题解决办法
- Linux(CentOS7)使用 RPM 安装 mysql 8.0.11的教程
- Android Adapter里面嵌套ListView实例详解
- Centos7 安装达梦数据库的教程
- Android开发使用Handler实现图片轮播功能示例
- 简单实现Android刮刮卡效果
- CentOS7.4下 安装JDK1.8的图文教程
- Android Studio中导入JNI生成的.so库的实现方法
- Android实现文件上传和下载倒计时功能的圆形进度条
- 使用Apache ab进行http性能测试
- Android Imageloader的配置的实现代码
- Linux下如何查看版本信息的方法步骤
- Android开发实现Files文件读取解析功能示例
- Android实现iPhone晃动撤销输入功能 Android仿微信摇一摇功能