题目描述
题干:
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例1:
输入:[3,2,3]
输出:3
示例2:
输入:[2,2,1,1,1,2,2]
输出:2
题解思路
简单来说就是找到数组中的众数,最先想到的方法就是哈希表,用HashMap来统计出现个数,最后返回Value最大的Key
但是这次官方的题解让我大跌眼镜,他给出了五种方法,涉及了分治、位运算、数学思想和哈希表各个方向,我这里只给出了最好理解的两种
当然你如果感兴趣可以去看原题的题解,好像评论区有人指出官方题解存在错误,你也可以试着去证明一下
正确代码
//排序法 众数排序后一定会在中间位置
public int majorityElement01(int[] nums) {
Arrays.sort(nums);
return (nums[nums.length / 2]);
}
//哈希表法
public int majorityElement02(int[] nums) {
HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
for (int num : nums) {
if (!hashMap.containsKey(num)) {
hashMap.put(num, 1);
} else {
hashMap.put(num, hashMap.get(num) + 1);
}
}
Map.Entry<Integer,Integer> majorityEntry = null;
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()){
majorityEntry = entry;
}
}
return majorityEntry.getKey();
}
总结
其实最近做哈希表的题做多了之后发现很多要理解的地方,可能还是底层不太理解,红黑树和拓展数组的地方还是看不太明白
另外还有哈希表的复杂度按理说不应该都是O(1)吗,为什么用哈希表的解法往往是效率最低的做法,实在令人费解
其次就是面试金题,重写equals时一定要重写HashCode方法,还得写一篇随笔来学习和记录其中的原因
文章如果存在问题或者可以回答我的疑惑,欢迎大佬斧正和评论,各自努力,你我最高处见