LeetCode——229. 求众数 II

题目

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

题目传送门

思路

开辟一个hash表,然后遍历一遍进行统计,然后再遍历一遍哈希表,找出出现次数超过1/3的即可!

代码

import java.util.*;

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        int length = nums.length;
        int t=length/3;
        Map<Integer,Integer> map = new HashMap<>();
        List<Integer> ans = new ArrayList<>();
        for(int i=0;i<length;++i)
        {
            if(map.containsKey(nums[i]))
            {
                map.put(nums[i],map.get(nums[i])+1);
            }
            else
                map.put(nums[i],1);
        }
        Iterator<Integer> iterator = map.keySet().iterator();
        while (iterator.hasNext())
        {
            int key = iterator.next();
            if (map.get(key)>t)
            {
                ans.add(key);
            }
        }
        return ans;

    }
}

结果

在这里插入图片描述

思路2

这个是题解的思路,本来以为摩尔投票法只能用在找出过半的数字,没想到还可以用来找到找出超过三分之一的数字!

因为要超过三分之一,所以最多只能由两个数超出三分之一。也就是,最多有两候选人。
然后就仿照一个候选人那样子,当前数值如果等于候选人的数值且候选人的票数大于0,就再自增1票,否则,如果有候选人票数为0,将当前数值置为候选人并且增加票数,否则,三个数都不一样的情况下,互相抵消!

最后,统计票数时,当前候选人的票数要大于0且整个数组中出现的次数要大于三分之一。

代码

import java.util.*;

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        int length = nums.length;
        int t = length/3;
        List<Integer> ans = new ArrayList<>();
        int candidate_1 = 0; //候选人1
        int candidate_2 = 0; //候选人2
        int vote_1 = 0;      //候选人票数1
        int vote_2 = 0;		 //候选人票数2 
        for (int i=0;i<length;++i)
        {
            if (vote_1>0 && nums[i]==candidate_1) // 当前已经有候选人并且票数大于0
                ++vote_1;
            else if (vote_2>0 && nums[i]==candidate_2)
                ++vote_2;
            else if (vote_1==0)
            {
                candidate_1=nums[i];
                ++vote_1;
            }
            else if (vote_2==0) 
            {
                candidate_2=nums[i];
                ++vote_2;
            }
            else    //  三个数都不同,互相抵消
            {
                --vote_1;
                --vote_2;
            }
        }
        int count_1=0;
        int count_2=0;
        for (int g=0;g<length;++g)
        {
            if (vote_1> 0 && nums[g]==candidate_1)
                ++count_1;
            else if (vote_2>0 && nums[g]==candidate_2)
                ++count_2;
        }
        if (count_1>t)
            ans.add(candidate_1);
        if (count_2>t)
            ans.add(candidate_2);
        return ans;
    }
}

结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值