题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
1 <= 数组长度 <= 50000
思路
- 最开始想的是,先排序,但是想了想时间复杂度太高了至少O(nlgn)
- 于是想到插入排序,走到一半只要看(arr.length+1)/2-1就可以判断出,写了半天发现思路是错的,这样根本行不通
- 于是想到使用map最后效果还是不理想
执行结果
结果太差劲了,速度太慢啦
我的代码
class Solution {
public int majorityElement(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i<nums.length;i++) {
if(map.containsKey(nums[i])) {
int v = map.get(nums[i]);
map.put(nums[i], ++v);
}else {
map.put(nums[i], 1);
}
}
int ans = -1;
int max = 0;
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey()+"==="+entry.getValue());
if(entry.getValue()>max) {
max = entry.getValue();
ans = entry.getKey();
}
}
return ans;
}
}
优秀代码(超快)
class Solution {
public int majorityElement(int[] nums) {
int x = 0, votes = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
return x;
}
}