题目
描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
输入描述:
保证数组输入非空,且保证有解
思路
题目中已经默认有一个数一定满足条件,所以只需要找到出现次数最多的这个数就行了,建立哈希表进行统计元素出现次数,返回出现次数最多的对应元素。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param numbers int整型一维数组
# @return int整型
#
class Solution:
def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:
# write code here
# 建立一个哈希表来存储每个元素出现的个数
storage = {}
max_count = 0
for ele in numbers:
if ele not in storage.keys():
storage[ele] = 1
if storage[ele] > max_count:
max_count = storage[ele]
res = ele
else:
storage[ele] += 1
if storage[ele] > max_count:
max_count = storage[ele]
res = ele
return res
c++版本:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
map<int, int> storage;
int len = numbers.size();
int max_value = 0;
int res = numbers[0];
for(int i=0; i< len; i++){
if(storage.find(numbers[i]) != storage.end()){
storage[numbers[i]] += 1;
if(storage[numbers[i]]>max_value){
max_value = storage[numbers[i]];
res = numbers[i];
}
}else{
storage[numbers[i]] = 1;
if(storage[numbers[i]]>max_value){
max_value = storage[numbers[i]];
res = numbers[i];
}
}
}
return res;
}
};