题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:1.可以使用快速排序的思路,因为出现次数超过一半的数字肯定是中位数,使用Partition函数划分数组,直到返回一个下标为(length-1)/2的元素即为所求。
2.如果说一个数字出现次数超过数组长度的一半那么它出现的次数一定是比其他数字出现次数之和还要多的,所以可以使用一个变量来保存数字出现的次数,如果下一个数字与上一个相同则次数加一,否则减一,如果次数为零,则保存这个数字,并把次数设置为1.那么在遍历完整个数组后,最后一次把次数设置为1的元素就是所求的元素。但是这个元素不一定存在所以在最后还需要判断一下。
思路2实现代码:
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0) return 0; int res = array[0]; int times = 1; for(int i=1; i<array.length; i++) { if(times == 0) { res = array[i]; times = 1; } else if(res == array[i]) { times ++; } else { times --; } } int checkTimes = 0; for(int i=0; i<array.length; i++) { if(res == array[i]) { checkTimes ++; } } if(checkTimes * 2 <= array.length) { return 0; } return res; } }
原文:http://www.cnblogs.com/wxisme/p/5459635.html