问题描述:数组中有一个数字出现的次数超过数组长度的一半,编写程序找出这个数字。
思路1:根据数组的特点找出O(n)算法,数组中有一个数组出现的次数超过数组长度的一半,也就是说它出现的次数比其它所有数字出现的次数之和还要多,因此可以在遍历数组的时候保存两个值,一个是数组中的一个数字,一个是这个数字出现的次数,当遍历到下一个数字的时候,如果下一个数字和保存的数字相同,则出现的次数加1,如果不同,则次数减1,如果次数为0,则需要保存下一个数字,并把次数设为1,由于要找的数字比其它所有数字出现的和还要多,那么要找的数字肯定是最后一次把次数设为1的数字。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length == 0){
return 0;
}
if(array.length == 1){
return array[0];
}
int res = array[0];
int count = 1;
for(int i = 1;i < array.length;i++){
if(array[i] == res){
count++;
}else{
count--;
}
if(count == 0){
res = array[i];
count = 1;
}
}
int len = 0;
for(int i = 0;i < array.length;i++){
if(array[i] == res){
len++;
}
}
if(len*2>array.length){
return res;
}
return 0;
}
}