原题大概是一个现实情况,小明微信收到很多红包很开心,他发现有个红包金额出现的次数超过了总红包数的一半,求一种算法能快速找到这个金额。
抽象起来就是一个数组,存在一个数重复次数超过了数组长度的一半,找到这个数。
思想:用计数的方式表示删除两两个不同的元素,最后剩余的一定是要找的这个数字,时间复杂度为O(n),空间复杂度为O(1)
java程序如下:
public class Solution {
boolean inputinvalid = false;
public int moreThanHalfNum(int[] numbers,int length){
if(numbers==null&&length==0){
inputinvalid=true;
return 0;
}
inputinvalid = false;
int result = numbers[0];
int times = 1;
for(int i=1;i<length;i++){
if(times==0){
result=numbers[i];
times=1;
continue;
}else if(result == numbers[i]){
times++;
}else{
times--;
}
}
//ensure the result appears more than half the length
times = 0;
for(int i=0;i<length;++i){
if(result==numbers[i]){
times++;
}
}
if(times*2<=length){
inputinvalid = true;
return 0;
}
return result;
}
}