剑指offer(牛客)---27.数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length <= 0)
return 0;
HashMap <Integer,Integer> map = new HashMap <Integer,Integer>();
for(int i = 0;i < array.length;i++){
if(map.containsKey(array[i])){
map.put(array[i], map.get(array[i])+1);
}else{
map.put(array[i], 1);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue() > array.length/2)
return entry.getKey();
}
return 0;
}
}
解题思路:
该算法的时间复杂度:网上很多人说它的算法复杂度是O(n),这是错误的,很多人没有考虑到hashmap.containsKey("");
它里面的源码:
它的时间复杂度应该是O(n^2)
网上方法有很多,我个人对比下来更喜欢用hashmap因为它更好理解;
其实思路挺简单了,就是new一个hashmap(key保存数组的值,value保存次数),然后在遍历数组的时候进行判断,hashmap里面没有的就加进去并且count++,没有的话就put一个进去;