数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
题解:首先想到的常规解法是利用HashMap
- 首先引入 HashMap 数据结构
- 首先利用 hashmap.containsKey() 判断数组当前的值是否在容器中已经存在,如果不存在,直接将 value 值设为1。如果存在,则将通过 hashmap.get(nums[i])获取的 value 加1.
- 通过 for each 遍历容器的 key 值。
- 判断是否大于数组长度的一半
class Solution {
HashMap<Integer,Integer> hashMap = new HashMap<>();
public int majorityElement(int[] nums) {
int key = nums.length/2+1;
for (int i = 0; i < nums.length; i++) {
if(hashMap.containsKey(nums[i])){
hashMap.put(nums[i],hashMap.get(nums[i])+1);
}else {
hashMap.put(nums[i],1);
}
}
// sum 为遍历 hashmap 的 key 值
for (Integer sum:hashMap.keySet()) {
if(hashMap.get(sum)>=key){
return sum;
}
}
return -1;
}
}
利用众数,中位数性质来解题
class Solution {
public int majorityElement(int[] nums) {
int key = nums.length/2;
Arrays.sort(nums);
return nums[key];
}
}