题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
[方法一]
暴力,O(nlogn)
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
if (n <= 0) return 0;
if (n == 1) return array[0];
// 排序
Arrays.sort(array);
int k = array[n - 1];
// 创建一个数组存储每个数字出现的次数
int[] C = new int[k + 1];
for (int i = 0; i < n; i++) {
C[array[i]]++;
}
for (int i = 0; i < k; i++) {
if (C[i] > n / 2)
return i;
}
return 0;
}
}
[方法二]
数组中出现次数超过一半的数字,也就是这个数字在数组中出现的次数是最多的,利用这个特点,遍历时保存两个值:数组中的数字 array[i]、次数 count = 1。
当遇到和保存的数字相同的,count++,遇到不同的 count–,当 count = 0 时,就记录下当前数字。因为要找的数出现次数最多,所以肯定最后 count >= 1,输出对应的数字就可以。
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
if (n <= 0) return 0;
int res = array[0];
int count = 1;
for (int i = 0; i < n; i++) {
if (count == 0) {
// 保存当前数字
res = array[i];
// 重新置为1
count = 1;
} else if (res == array[i])
count++;
else
count--;
}
// 检查
// 计算找出的数字出现的次数
count = 0;
for (int i = 0; i < n; i++) {
if (array[i] == res)
count++;
}
if (count * 2 <= n)
return 0;
return res;
}
}