题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路1
第一想法是用哈希表,如果包含键key,其值 value 保存出现的次数 ;如果不包含,首次出现设置其value为1,即put(key, 1)
import java.util.HashMap;
public class Solution
{
public int MoreThanHalfNum_Solution(int [] array)
{
HashMap<Integer,Integer> hash = new HashMap<>();
if(array.length == 1)
return array[0];//数组长度为1,单独考虑
for(int i=0; i<array.length; i++)
{
if(hash.containsKey(array[i]))
{
int count = hash.get(array[i]);//取key对应的value值
hash.put(array[i], ++count);//注意是++count,若改为count++,则错误
if(count > (array.length )/2)
{
return array[i];
}
}
else
{
hash.put(array[i], 1);
}
}
return 0;
}
}
思路2
先对数组排序,若是符合条件的数存在,则一定是中间那个数。(排序是快排,时间复杂度为O(NlogN))
import java.util.Arrays;
public class Solution
{
public int MoreThanHalfNum_Solution(int [] array)
{
Arrays.sort(array);
int count = 0;
int middle = array[array.length/2];//暂存中间的值
for(int i=0; i<array.length; i++)
{
if(array[i] == middle)
count++;
}
if(count > array.length/2)
return middle;
else
return 0;
}
}