剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
首先这道题我就想到了排序和map两个方法,但是排序时间复杂度高,我就使用了map解法,以下是代码 ,但是时间复杂度和空间复杂度仍然不低
public int majorityElement(int[] nums) {
int len = nums.length/2;
System.out.println(len);
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i = 0;i < nums.length;i++){
Integer temp = map.get(nums[i]);
if(temp == null) {
map.put(nums[i], 1);
}else {
map.put(nums[i], temp + 1);
}
}
int count = 0;
for (Entry<Integer,Integer> a : map.entrySet()) {// 节点的key和value进行遍历 返回一个set集合
if(a.getValue() > len) {
count = a.getKey();
}
}
return count;
}
于是我又找到了一个叫摩尔投票的算法 非常简单 放代码
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;
}