LeetCode——169. 多数元素

题目描述

题干:
给定一个大小为 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方法,还得写一篇随笔来学习和记录其中的原因

文章如果存在问题或者可以回答我的疑惑,欢迎大佬斧正和评论,各自努力,你我最高处见
上一篇:tensorflow保存模型、恢复模型


下一篇:AtCoder Beginner Contest 169(题解)