数组中出现次数超过一半的数
数组中出现次数超过一半的数字
http://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163
- 哈希法:
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int len = array.length >> 1; Map<Integer, Integer> cntMap = new HashMap<>(); for(int num : array){ cntMap.put(num, cntMap.getOrDefault(num, 0) + 1); } for(int num : cntMap.keySet()){ if(cntMap.get(num) > len) return num; } return 0; } }时间复杂度 O(N)
空间复杂度 O(N)
- 候选法:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int target = -1;
int cnt = 0;
//找出出现次数最多的那个
for(int i = 0; i < array.length; i++){
if(cnt == 0){
target = array[i];
cnt++;
}else{
if(target == array[i])
cnt++;
else cnt--;
}
}
//检查是不是众数
cnt = 0;
for(int num : array){
if(target == num) ++cnt;
}
if(cnt > (array.length >> 1)) return target;
return 0;
}
}时间复杂度 O(1)
空间复杂度 O(N)

