题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
思路实现
- 摩尔投票法
- 哈希表统计法
- 数组排序法
代码实现:
import java.util.Arrays;
import java.util.HashMap;
public class Offer39_MajorityElement {
// 摩尔投票法
public int majorityElement(int[] arr){
int x = 0, count = 0;
for(int num : arr){
if(count == 0) x = num;
count += num == x ? 1 : -1;
}
return x;
}
//哈希表统计法
public int majorityElement2(int[] arr){
HashMap<Integer, Integer> hash = new HashMap<>();
for(int num : arr){
if(hash.containsKey(num)){
Integer value = hash.get(num);
hash.put(num,value+1);
}else{
hash.put(num, 1);
}
}
int base = arr.length / 2;
for(Integer key: hash.keySet()){
if(hash.get(key) > base){
return key;
}
}
return -1;
}
// 数组排序法
public int majorityElement3(int[] arr){
Arrays.sort(arr);
return arr[arr.length/2];
}
}