剑指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 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...
随机推荐
- 08CSS边框边距
CSS边框边距 边框样式——border-style border-top-style border-bottom-style border-left-style border-right-style ...
- tomcat 去掉项目名后,还可以用项目名
在server.xml添加以下代码: <Context path="/" docBase="../webapps/jeeplus/" reloadable ...
- GPS坐标转化距离(短距离模型公式)
下面是C#计算方法: class Program { const double EARTH_RADIUS = 6378.137; static void Main(string[] args) { d ...
- jquery toggle()设置
很多朋友对jquery toggle()比较熟练,甚至经常用到,而且对toggle的三个参数也比较了解$(selector).toggle(speed,callback,switch).但是当你设置$ ...
- 3D超炫酷旋转
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- UVa 1599 理想路径(反向BFS 求最短路径 )
题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...
- 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小
用处 基于SVD实现模型压缩以适配低功耗平台 根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...
- JS逻辑运算符&&与||的妙用
JS逻辑运算符&&与||的妙用 /* 文章写的不错 就此分享 */ &&中第一个表达式为假就不会去处理第二个表达式,直接放回结果. || 中就刚很好相反.如果第一个 ...
- Xcode8、 iOS10 适配问题
调用相机.相册.麦克风.位置等隐私问题崩溃解决办法 你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志: 这是因为iOS对 ...
- codeforces365A
#include<stdio.h> #include<string.h>//刚做codeforces上的比赛题我都没看懂啊啊啊啊啊啊 int main() { int n,m, ...