面试题29:数组中出现次数超过一半的数字
来源:互联网 发布:80端口和8080端口区别 编辑:程序博客网 时间:2024/06/05 20:26
基于Partition函数的O(n)方法
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {if(array==null||array.length==0)
return 0;
int middle=array.length>>1;
int start=0;
int end=array.length-1;
int index=Partition(array,start,end);
while(index!=middle){
if(index>middle){
end=index-1;
index=Partition(array,start,end);
}
else{
start=index+1;
index=Partition(array,start,end);
}
}
int result=array[middle];
if(!CheckMoreThanHalf(array,result))
result=0;
return result;
}
public static boolean CheckMoreThanHalf(int array[],int number){
int times=0;
for(int i=0;i<array.length;++i){
if(array[i]==number)
times++;
}
boolean isMoreThanHalf=true;
if(times*2<=array.length){
isMoreThanHalf=false;
}
return isMoreThanHalf;
}
public int Partition(int array[],int start,int end){
int pivotkey=(int)start+(int)Math.random()*(end-start);
while(start<end){
while(start<end&&array[end]>=array[pivotkey])
end--;
swap(array,start,end);
while(start<end&&array[start]<=array[pivotkey])
start++;
swap(array,start,end);
}
return start;
}
public void swap(int[] array,int num1,int num2){
int temp =array[num1];
array[num1] =array[num2];
array[num2] =temp;
}
}
方法二:根据数组特点找出O(n)的算法
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int length=array.length;
if(array==null||length<=0){
return 0;
}
int result=array[0];
int times=1;
for(int i=1;i<length;i++){
if(times==0){
result=array[i];
times=1;
}else{
if(array[i]==result){
times++;
}else{
times--;
}
}
}
times=0;
for(int i=0;i<length;i++){
if(result==array[i]){
times++;
}
}
if(times*2<=length){
result=0;
}
return result;
}
}
- 面试题:数组中出现次数超过一半的数字
- 面试题:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- [剑指offer][面试题29]数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字(面试题 29)
- 剑指Offer:面试题29 数组中出现次数超过一半的数字
- 面试题29 数组中出现次数超过一半的数字
- 剑指offer 面试题29—数组中出现次数超过一半的数字
- 《剑指Offer》学习笔记--面试题29:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
- 面试题29_数组中出现次数超过一半的数字
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
- 面试题29数组中出现次数超过一半的数字
- 剑指offer面试题29-数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 【Pat】甲级1005
- Android L SurfaceFlinger dump信息全解(1)
- Hadoop 新 MapReduce 框架 Yarn 详解
- python 实现自动登陆
- 分享一个比较简单的canvas+js 飞翔的小鸟小游戏
- 面试题29:数组中出现次数超过一半的数字
- 【mysql】Date和String的互相转换(DATE_FORMAT & STR_TO_DATE)
- ReactNative 样式
- 对TCP/IP网络协议的深入浅出归纳
- 异常
- 不再是概念,人工智能时代真的要来了【智库2861】
- 简单的响应式表格布局
- MySQL正则表达式搜索.md
- 80. Remove Duplicates from Sorted Array II