找出数组中出现的次数超过数组长度的一半
2016-01-13 16:25
267 查看
问题说明:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。方法1:
如果在一个数组中有一个数字出现的次数超过整个数组长度的一半,那么将该数组排序后,位于中间位置的数字一定是该数字。我们可以给数组进行排列,取出中间值,再拍段该数组的中间值出现次数是否超过该数组总数目的半数。这样效率方面并不是很高,借助于快速排序的思想,对该数组进行一次快速排序,以数组最后一个数字为比较校准,小于该数字的放到其前面,大于该数字的放到其后面。最后返回该数字在数组中所处的位置。如果该数字位于数组的中间,那该数组便可能是这个数组中出现次数超过半数的数字(在该数组中进行该数字个数的查询,判断是否超过半数)。如果返回的数字位置不位于数组中间,则再次进行快速查询。<span style="font-size:18px;"><span style="white-space:pre"> </span>public static int findMoreThanHalf(int[] arr){ if(arr==null){ return -1; } int len=arr.length; int begin=0; int end=len-1; if(len==0){ return -1; } if(len==1){ return arr[0]; } int middle=len/2; int index=per(arr,begin,end); while(index!=middle){ if(index>middle){ end=index-1; index=per(arr,begin,end); }else{ begin=index+1; index=per(arr,begin,end); } } int result=arr[index]; if(!isMoreThanHalf(arr,result)){ result=-1; } return result; } /** * 判断该数组的中间数的个数是不是超过了数组的一般数 * @param arr * @param temp * @return */ public static boolean isMoreThanHalf(int[] arr,int temp ){ int num=0; int middle=arr.length/2; for(int i=0;i<arr.length;i++){ if(arr[i]==temp){ num++; } } if(num>middle){ return true; } return false; } /** * 快速排序的一次 * 以该数组最后一个个值做为标准,比它大的排前面, * 小的排后面 * @param arr * @param begin * @param end * @return */ public static int per(int[] arr,int begin,int end){ int small=begin-1; int len=arr.length; if(len==0 || begin>end){ return -1; } for(int i=begin;i<end;i++){ if(arr[i]<arr[end]){ small++; if(small!=i){ swap(arr,i,small); } } } small++; if(small!=end){ swap(arr,small,end); } return small; } /** * 交换数组指定两位置的值 * @param arr * @param fir * @param sec */ public static void swap(int[] arr,int fir,int sec){ int temp=arr[fir]; arr[fir]=arr[sec]; arr[sec]=temp; }</span>
方法2:
<span style="font-size:18px;">/** * 既然是查找一个在数组中重复多余一半的数字,则 * 如果计算其个数,一定大于数组中其他数字所有的数目。 * 策略:一个数字代替当前数字,一个代表当前数字的个数: * 如果重复则加1,如果不同,则减1;如果num变为0,则把当前数字指向本数字 * @param arr * @return */ public static int isMoreThanHalf(int[] arr){ if(arr==null){ return 0; } int len=arr.length; if(len==0){ return 0; } int num=1; int temp=arr[0]; for(int i=1;i<len;i++){ if(arr[i]==temp){ num++; }else{ num--; if(num==0){ temp=arr[i]; num++; } } } if(num>len/2){ return temp; } return 0; }</span>
相关文章推荐
- 存储过程带输出参数,建job的what写法
- 终于有了自己的博客
- 数据类型不一致时,a=b=c表达式引起的bug
- Perl,第一种后现代计算机语言
- Windows的doc命令
- unity让shader支持UGUI Mask
- 【Android】Android Studio快捷键
- 关于swift中出现 use of undeclared type ***错误的一种解决方法
- linux32bit oracle10g更改字符集AL32UTF8为ZHS16GBK
- swift NSArray(数组)
- IOS中LineBreakMode有哪些类型
- LightOJ1032 Fast Bit Calculations(数位DP)
- C#开发接口——MongoDB(对库操作)
- eclipse:不能在tomcat里添加一个项目的解决方法
- iOS 点击注释图标 弹出对应解释
- Reddit指南
- iOS 安全(一)
- How to handle various of Out Of Memory Issues
- Win7旗舰版系统提示应用程序错误代码0xc0000409的故障原因及解决方法
- onload和onunload 到底是怎样的事件