题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
- “抵消思想”:若有一个数字出现次数超过数组长度的一半,那么将其与其他数字抵消后的结果一定大于0
1.遍历数组,记录数组可能符合的值以及次数
2.初始时假设符合要求的值为array[0],次数为1,遍历下一个值时,若与arra[0]相同,则次数+1,否则次数-1
3.当次数减为0时,重置可能符合的值为当前位置的值,次数为1
4.最后验证遍历完数组后可能符合条件的值里记录的值,若其出现次数超过数组长度的一半,即为所求
实现:
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 time=1;
for(int i=1;i<length;i++){
if(time==0){ //time为0说明被抵消
result=array[i];
time=1;
}else{
if(array[i]==result){
time++;
}else{
time--;
}
}
}
time=0; //验证最后可能符合的数是否达到数组长度的一半
for(int i=0;i<length;i++)
{
if(result==array[i]){
time++;
}
}
return (time > length/2) ? result : 0;
}
}