leetcode169多数元素java题解(Hash)(排序)(Boyer-Moore投票)

1.题目
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:输入: [3,2,3]输出: 3
示例 2:输入: [2,2,1,1,1,2,2]输出: 2
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
2.想法
(1)hash
将每个数及其出现的次数用hash表存起来,最后查找大于n/2的元素
缺点:非常耗时
(2)排序
由于题目给出一定存在多数元素,故利用java api自带的Arrays类中的排序函数,是基于快排的排序,将数组排序,最终返回下标为n/2的值一定为结果。
(3)Boyer-Moore投票
如果遇到一个候选数,就将计数器加一,否则减一。只要计数器等于 0 ,就将数组中之前访问的数字全部忘记 ,并把下一个数字当做候选数。
原因是在遗忘前面的数字的时候,会去掉相同数目的众数和非众数。最终留下的数的计数器一定为正的。
3.图解
来源:力扣官方题解
在这里插入图片描述
4.自己题解
(1)hash

class Solution {
    public int majorityElement(int[] nums) {
    HashMap<Integer,Integer> m=new HashMap<>();
    for(int i=0;i<nums.length;i++)
    {if(m.containsKey(nums[i])){int temp=m.get(nums[i]);temp++;m.put(nums[i],temp); }
     else{m.put(nums[i],1);}
    }
    for(Integer i:m.keySet())
     { if(m.get(i)>(nums.length/2)){return i;}}
    return -1;
    }
}

(2)排序

class Solution{
    public int majorityElement(int nums[])
    {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

(3)Boyer-Moore投票

class Solution{
    public int majorityElement(int nums[])
    {	int cur=0;
     	int count=0;
        for(int i=0;i<nums.length;i++)
        {
            if(count==0){cur=nums[i];}
            if(nums[i]==cur){count++;}
            else{count--;}           
        }       
        return cur;
    }
}

5.效率
(1)hash
在这里插入图片描述
(2)排序
在这里插入图片描述
(3)Boyer-Moore投票
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值