剑指Offer面试题29(java版):数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
比如输入一个长度为9的数组{1,2,3,2。2,2。5,4,2}。因为数字2在数组中出现5次,超过数组长度的一半,因此输出2.
解法一:基于Partition函数的O(n)算法:
我们的算法是受高速排序的算法的启示。在随机高速排序的算法中。我们先在数组中随机的选择一个数字。然后调数组中数字的顺序,使得比选中的数字小数字排在它的左边。比选中的数字大的数字都排在它的右边。比方这个选中的数字的下标刚好是n/2。那么这个数字就是数组中的中位数。假设它的下标大于n/2。那么中位数应该位于它的左边。我们能够接着在它的左边部分的数组中查找。假设它的下标小于n/2,那么中位数应该在它的右边,我们能够接着在它的右边部分中查找。这是一个典型的递归过程。
Java代码实现步骤例如以下:
/**
*
*/
package swordForOffer; /**
* @author JInShuangQi
*
* 2015年8月8日
*/
public class E29MoreThanHalfNumber {
//适用partition函数
public int partition(int[] arr,int left,int right){
int result = arr[left];
if(left > right)
return -1; while(left <right){
while(left <right && arr[right]>= result){
right --;
}
arr[left] = arr[right];
while(left <right && arr[left] <result){
left++;
}
arr[right] = arr[left];
}
arr[left] = result;
return left;
}
public int moreThanHalfNum(int[] arr){
if(arr.length ==0)
return -1; int length = arr.length;
int middle = length >>1;
int start = 0;
int end = length -1;
int index = partition(arr,start,end);
while(index != middle){
if(index >middle){
end = index - 1;
index = partition(arr,start,end);
}
else{
start = index + 1;
index = partition(arr,start,end);
}
} int result = arr[middle];
if(!checkMoreThanHalf(arr,result)){
result = -1;
}
return result;
}
//验证是否存在
public boolean checkMoreThanHalf(int[] arr,int number){
int times = 0;
for(int i = 0;i<arr.length;i++){
if(arr[i] == number)
times ++;
}
boolean isMoreThanHalf = true;
if(times *2 <= arr.length){
isMoreThanHalf = false;
}
return isMoreThanHalf;
}
public static void main(String[] args){
int[] arr= {1,2,3,3,2,5,4,2};
E29MoreThanHalfNumber test = new E29MoreThanHalfNumber();
System.out.println(test.moreThanHalfNum(arr));
}
}
解法二:依据数组的特点找出O(n)的算法:
接下来我们从另外一个角度来解决问题。
数组中有一个数字出现的次数超过数组长度的一半。也就是说它出现的次数比其它全部数字出现的次数的和还要多。因此我们能够遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。当我们遍历到下一个数字的时候。假设下一个数字和我们之前保存的数字同样,则次数加1;假设下一个数字和我们之前保存的数字不同,则次数减1.假设次数为0,我们须要保存下一个数字,并把次数设为1.因为我们要找的数字出现的次数比其它全部数字出现的次数之和还要多。那么要找的数字肯定是最后一次把次数设为1时相应的数字。
//解法二:
public int moreThanHalfNum2(int[] arr){
if(arr.length == 0)
return -1;
int result = arr[0];
int times = 1;
for(int i = 1;i<arr.length;i++){
if(times == 0){
result = arr[i];
times = 1;
}else if(arr[i] == result)
times++;
else
times--;
}
if(!checkMoreThanHalf(arr,result))
result = -1;
return result;
}
剑指Offer面试题29(java版):数组中出现次数超过一半的数字的更多相关文章
- 《剑指offer》— JavaScript(28)数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超 ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指offer面试题3二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 需要与面试官确认的是,这 ...
- 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 剑指offer面试题3 二维数组中的查找 (java)
注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...
- 剑指offer面试题4: 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指Offer面试题:6.旋转数组中的最小数字
一 题目:旋转数组中的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1, ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- 剑指Offer - 九度1384 - 二维数组中的查找
剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
随机推荐
- Vue完成TodoList案例
写一个简单的TodoList的更实用(文末有彩蛋). 一,使用VUE-CLI脚手架快速搭建一个框架 利用VUE-CLI来自动生成我们项目的前端目录及文件,方法: npm install -g vue- ...
- JavaScript:JSON 和 JS 对象
区别 JSON(JavaScript Object Notation)仅仅是一种数据格式(或者叫数据形式).数据格式其实就是一种规范,按照这种规范来存诸和交换数据.就好像 XML 格式一样. 区别 J ...
- torch.nn.Embedding理解
Pytorch官网的解释是:一个保存了固定字典和大小的简单查找表.这个模块常用来保存词嵌入和用下标检索它们.模块的输入是一个下标的列表,输出是对应的词嵌入. torch.nn.Embedding(nu ...
- 诊断:CLSRSC-400: A system reboot is required to continue installing.
Linux7.5安装Grid Infrastructure 12.2.0.1时,在root.sh时会报错 2018/01/30 09:19:28 CLSRSC-330: Adding Clusterw ...
- 2D热力图实例
<div style="height: 100px; width: 200px" id="heatmap"></div> <scr ...
- CSU 2018年12月月赛 H(2220): Godsend
Description Leha somehow found an array consisting of n integers. Looking at it, he came up with a t ...
- 零基础入门学习Python(5)--闲聊之Python的数据类型
前言 本次主要闲聊一下python的一些数值类型,整型(int),浮点型(float),布尔类型(bool),还有e记法(科学计数法),也是属于浮点型. 数值类型介绍 整型 整型就是我们平时所说的整数 ...
- 593. Valid Square
Problem statement: Given the coordinates of four points in 2D space, return whether the four points ...
- redis持久化机制【十三】
一.Redis提供了哪些持久化机制: redis的高性能是因为其所有数据都存在了内存中 ,为了使redis在重启之后数据仍然不丢失,需要将数据同步到硬盘中,这一过程就是持久化. redis支持两种方式 ...
- hdu_1398_Square Coins_201404260953
Square Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...