前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >229. 求众数 II

229. 求众数 II

作者头像
张伦聪zhangluncong
发布2022-10-26 17:58:20
4630
发布2022-10-26 17:58:20
举报

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

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

代码语言:javascript
复制
输入: [3,2,3]
输出: [3]

示例 2:

代码语言:javascript
复制
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]

解1:AC解,空间复杂度不满足,看解2摩尔投票法

代码语言:javascript
复制
 public List<Integer> majorityElement(int[] nums) {
        Set<Integer> result = new HashSet<>();
        HashMap<Integer, Integer> map = new HashMap();
        for (int i = 0; i < nums.length; i++) {
            if (!map.containsKey(nums[i])) {
                map.put(nums[i], 1);
                if (1 > nums.length / 3) {
                    result.add(nums[i]);
                }
            } else {
                int count = map.get(nums[i]) + 1;
                map.put(nums[i], count);
                if (count > nums.length / 3) {
                    result.add(nums[i]);
                }
            }
        }
        return new ArrayList<>(result);
    }

解2:任意一个数组出现次数大于n/3的众数最多有两个。 主要思想是互相抵消k为(n/k)中的k,抵消k个数。 摩尔投票法

代码语言:javascript
复制
public List<Integer> majorityElement(int[] nums) {
         int div = nums.length / 3;
        List<Integer> result = new ArrayList<>();
        //候选人有2个
        int hxr[] = new int[2];
        //候选人投票计数器2个
        int count[] = new int[2];
        for (int i = 0; i < nums.length; i++) {
            if (count[0] == 0) {
                hxr[0] = nums[i];
                count[0] = 1;
            } else if (hxr[0] == nums[i]) {
                count[0] = count[0] + 1;
            } else if (count[1] == 0) {
                hxr[1] = nums[i];
                count[1] = 1;
            } else if (hxr[1] == nums[i]) {
                count[1] = count[1] + 1;
            } else {
                count[0] = count[0] - 1;
                count[1] = count[1] - 1;
                //防止hxr0和hxr1是重复元素
                if (count[0] == 0 && count[1] > 0) {
                    hxr[0] = hxr[1];
                    count[0] = count[1];
                    hxr[1] = 0;
                    count[1] = 0;
                }
            }
        }
        //计算真实的数量
        count[0] = 0;
        count[1] = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == hxr[0]) {
                count[0] = count[0] + 1;
            } else if (nums[i] == hxr[1]) {
                count[1] = count[1] + 1;
            }
        }
        if (count[0] > div) {
            result.add(hxr[0]);
        }
        if (count[1] > div) {
            result.add(hxr[1]);
        }
        return result;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档