题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
- 最开始使用排序大法,最小是 O(nlogn)的复杂度,后面借鉴了discuss的内容;
- 设定两个变量,一个value用于保存当前值,一个count用于保存次数;
- 如果当前元素与value相同,则count加一;
- 如果当前元素与value相同,则count减一;
- 如果count是0,则证明当前的数字出现的次数已经抵消掉了之前不同的数字,所以更新value和count。
代码
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length == 0) return 0;
int value = array[0];
int count = 1;
for(int i = 1; i < array.length; i++){
if(count == 0){
value = array[i];
count = 1;
} else if(value == array[i]){
count++;
} else {
count--;
}
}
count = 0;
for(int i = 0; i < array.length; i++){
if(array[i] == value){
++count;
}
}
if(count > (array.length / 2)) return value;
return 0;
}
}