题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
我的思路
比较简单的题目,可以用好多做法来实现。我是使用字典来实现数字出现次数的统计的,因为字典的key是唯一的,所以将数组中的数字作为字典的key就可以快速的实现数字出现次数的统计了。
最佳思路
首先排序数组,之后取出数组的中间项。为什么取出中间项呢?因为如果该数组符合条件的话,那么经过排序,他的中间项一定是出现次数大于数组长度的数字。最后我们再遍历数组,统计与中间项相等的数字个数就行了。
我的代码
using System.Collections.Generic;
class Solution
{
public int MoreThanHalfNum_Solution(int[] numbers)
{
// write code here
Dictionary<int,int> dic=new Dictionary<int,int>();
for(int i=0;i<numbers.Length;i++)
{
if(!dic.ContainsKey(numbers[i]))
dic.Add(numbers[i],1);
else
dic[numbers[i]]++;
if(dic[numbers[i]]>numbers.Length/2)
return numbers[i];
}
return 0;
}
}
最佳代码
class Solution
{
public int MoreThanHalfNum_Solution(int[] numbers)
{
// write code here
int len=numbers.length;
if(len<1){
return 0;
}
int count=0;
Arrays.sort(numbers);
int num=numbers[len/2];
for(int i=0;i<len;i++){
if(num==numbers[i])
count++;
}
if(count<=(len/2)){
num=0;
}
return num;
}
}