题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路分析:
第一种思路;给数组进行排序,然后由于次数超过一半的数肯定是中位数,那么直接取出中位数,然后遍历数组,看该数是不是超过一半。这种思路的时间复杂度为O(nlgn);
第二种思路:遍历数组,利用HashMap保存值和它出现的次数,然后判断有没有次数超过一半的数字出现。这种思路的时间复杂度为O(n),空间复杂度也为O(n)。
第三种思路:遍历数组,设置flag值为数组的第一个元素,并且给它设置一个count值,初始值为1,然后遍历后面的数,如果遇到相同的数count加一,如果遇到不同的数count减一。然后判断count值是否为0,如果为0,那么更新flag为当前遍历到的元素的下一个元素,然后和前面的步骤一样进行遍历,更新flag。当遍历结束后flag值可能就是满足要求的值,然后我们判断它是否出现超过一半,如果是就返回结果,不是就返回零。这种思路的时间复杂度为O(n)。
代码:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array==null||array.length==0)
return 0;
int flag=array[0];
int count=1;
int i=1;
while(i<array.length){
if(array[i]!=flag){
count--;
if(count==0){
if(i+1<array.length){
flag=array[i+1];
count=1;
i=i+2;
}
}else{
i++;
}
}else if(array[i]==flag){
count++;
i++;
}
}
int times=0;
for(int j=0;j<array.length;j++){
if(array[j]==flag){
times++;
}
}
if(times>(array.length/2))
return flag;
return 0;
}
}