问题描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
解题思路:
解法一: HashMap解法
这题使用HashMap进行解题:key存储的是数组中的元素,value存储的是对应元素在数组中出现的次数。遍历数组进行统计即可得出每一个元素在数组中出现的次数。最后在HashMap中查找出现次数超过数组长度一半的元素。时间复杂度为:O(n)。需要遍历一次数组和遍历一次HashMap。
解法二: 排序解法
实现将数组排序,然后将数组的中位数返回即可;因为众数(要寻找的数)的出现次数是超过数组长度一半的。所以将数组进行排序后中位数肯定就是那个众数。这个解法的时间复杂度取决于排序算法的复杂度。一般复杂度为:O(Nlog2N)。
代码实现:
HashMap解法:
public int majorityElement(int[] nums) {
int res=0;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0; i<nums.length; i++) {
if(!map.containsKey(nums[i])) { //没有存储过
map.put(nums[i], 1);
}else {
map.put(nums[i], map.get(nums[i])+1); //存储过则将记录加一
}
}
for(Integer key:map.keySet()) {
int m = map.get(key);
if(m>nums.length/2) {
res = key;
break;
}
}
return res;
}
提交结果:
复杂度分析:
- 时间复杂度:O(n),
- 空间复杂度:O(n)