今天想学算法 2021-12-28 09:54 采纳率: 100%
浏览 35
已结题

求众数,超过三分之一怎么找呢?

给定一个大小为n的整数数组,找出其中所有超过n/3次的元素,可能有两个,可能有一个,可能没有。

一半我会求可以用异或,三分之一怎么办?

  • 写回答

2条回答 默认 最新

  • 俺不理解 2021-12-28 13:45
    关注

    摩尔投票法

    
    public class Solution229 {
    
    
        /**
         * 摩尔投票法,一次遍历,时间 O(n),空间O(1)
         */
        public List<Integer> majorityElement(int[] nums) {
            int v1 = 0, v2 = 0;
            int t1 = 0, t2 = 0;
            for (int v : nums) {
                if (v == v1) {
                    t1++;
                } else if (v == v2) {
                    t2++;
                } else if (t1 == 0) {
                    v1 = v;
                    t1 = 1;
                } else if (t2 == 0) {
                    v2 = v;
                    t2 = 1;
                } else {
                    t1--;
                    t2--;
                }
            }
            t1 = t2 = 0;
            for (int v : nums) {
                if (v == v1) {
                    t1++;
                } else if (v == v2) {
                    t2++;
                }
            }
            List<Integer> rst = new LinkedList<>();
            if (t1 > nums.length / 3) {
                rst.add(v1);
            }
            if (t2 > nums.length / 3) {
                rst.add(v2);
            }
            return rst;
        }
    
        /*
        Hash 方法,需要额外空间,时间 O(n),空间 O(n)
        public List<Integer> majorityElement(int[] nums) {
            Map<Integer, Integer> map = new TreeMap<>();
            for (int v : nums) {
                map.put(v, map.getOrDefault(v, 0) + 1);
            }
            List<Integer> list = new LinkedList<>();
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if (entry.getValue() > nums.length / 3) {
                    list.add(entry.getKey());
                }
            }
            return list;
        }
         */
    
        public static void main(String[] args) {
            Solution229 solution = new Solution229();
            printVals(solution.majorityElement(new int[] {
                    1, 2
            }));
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 SQL Server下载
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求