题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
限制:
- 1 <= 数组长度 <= 50000
题解:
摩尔投票法
正反抵消原则:
发现一个x,则计数+1,
发现一个非x,则技术-1;
class Solution {
public int majorityElement(int[] nums) {
int count= 0,value = -1;
for(int num : nums) {
if(count == 0) {
value = num;
count= 1;
} else if( value == num) {
count++;
} else{
count--;
}
}
return value;
}
}
class Solution {
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length/2];
}
}
class Solution {
public int majorityElement(int[] nums) {
int n = nums.length / 2;
Map<Integer, Integer> map = new HashMap();
for (int num : nums) {
Integer integer = map.get(num);
map.put(num, integer == null ? 1 : integer + 1);
}
Set<Integer> keys = map.keySet();
for (Integer key : keys) {
if (map.get(key) > n) {
return key;
}
}
return -1;
}
}