LeetCode 面试题17.10 主要元素

这篇博客介绍了如何使用哈希表解决LeetCode面试题17.10的主要元素问题。作者首先分享了自己的解题思路,指出初始错误是仅考虑小范围数字,然后提出使用哈希表以O(N)时间复杂度完成任务。提供了Java代码实现,并分析了时间复杂度和空间复杂度。尽管代码执行效率较高,但作者认为仍有优化空间,特别是从算法层面。此外,还提到了摩尔投票法作为另一种优秀解法。
摘要由CSDN通过智能技术生成

我的解题过程

解题思路

刚开始做的时候看到输入示例中数字都是十以内,天真的只设置了长度为十的数组…后来发现如果输入范围是全体实数,使用数组需要用到双循环,但题目要求时间复杂度O(N)内完成,受到第1题两数之和的启发,采用哈希表完成,哈希函数H(key) = key (key为输入的数字,value为出现的次数)

java代码

class Solution {
    public int majorityElement(int[] nums) {
       //创建哈希表
        HashMap<Integer,Integer> A = new HashMap<Integer,Integer>();
        int i;
	   
	   //遍历输入数组
        for(i=0;i<nums.length;i++){
            //判断哈希表中是否存在键值等于输入元素值的项
            if (A.containsKey(nums[i])){
            //若有,该key对应的value值+1
                A.replace(nums[i],A.get(nums[i])+1);
            }
            else{
            //若没有,则将该元素做为key插入,value值为1
                A.put(nums[i],1);
            }
        }
        
        //迭代哈希表
        for(Integer j:A.keySet()){
        //寻找value值符合要求的,输出其key值
            if(A.get(j)>nums.length/2){
                return j;
            }
        }
        return -1;
  	}
}        

复杂度分析

时间复杂度:O(N)
空间复杂度:O(N)
执行用时: 15 ms
内存消耗: 43.8 MB

问题与不足

运行时间和占用空间都很大,只会从数据结构上优化代码,没有从算法角度思考。

其他优秀题解

摩尔投票法

震撼全家的解法,摩尔投票法
这道题是无序数组寻找众数的问题。
**pairing阶段:**两个不同选票的人进行对抗,并会同时击倒对方,当剩下的人都是同一阵营,相同选票时,结束。

**counting阶段:**计数阶段,对最后剩下的下进行选票计算统计,判断选票是否超过总票数的一半,选票是否有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值