力扣Hot100——169. 多数元素

  1. 解法1:使用HashMap

    将nums数组映射到HashMap中,键为nums的值,值为nums中值的数量;

    然后遍历哈希表,返回值最大的键

    java 复制代码
    class Solution {
        private Map<Integer, Integer> countNums(int[] nums) {
            Map<Integer, Integer> counts = new HashMap<Integer, Integer>();
            for (int num : nums) {
                if (!counts.containsKey(num)) {
                    counts.put(num, 1);
                } else {
                    counts.put(num, counts.get(num) + 1);
                }
            }
            return counts;
        }
    
    	public int majorityElement(int[] nums) {
            Map<Integer, Integer> counts = countNums(nums);
    
            Map.Entry<Integer, Integer> majorityEntry = null;
            for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
                if (majorityEntry == null || entry.getValue() > majorityEntry.getValue()) {
                    majorityEntry = entry;
                }
            }
    
            return majorityEntry.getKey();
        }
    }

    作者:力扣官方题解

    链接:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/

    来源:力扣(LeetCode)

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  2. 解法2:由于众数数量超过n/2,并且众数一定存在,那么排序后的中间位置的值一定是众数

    java 复制代码
    // 排序取中位值
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
  3. 解法3:Boyer-Moore 投票算法

    首先明白一点:将众数标记为 +1,非众数标记为 -1,遍历所有数值后,众数的和一定是大于零的,因为众数有过半的票数。

    这就像是进行总统选举,我们维护一个总统候选人 candidate ,以及一个 candidate 的票数 count。当遍历选票时,第一次我们将第一张票作为 candidate 的值,然后遍历,遇到相同的票 count +1,否则 -1,当 count == 0,就将下一张票作为候选人 candidate,如此遍历至最后,candidate 的 count != 0的 candidate一定是票数最多的 candidate,也就是所有票中的众数。(原因就是上面的众数 + 非众数 count 结果一定大于零)

    java 复制代码
    class Solution {
    	
    	public int majorityElement(int[] nums){
    		int candidate = 0;
    		int count = 0;
    		
    		for(int num : nums){
    			if(count == 0){
    				candidate = num;
    			}
    			// 这行代码绝了
    			count +=  (candidate == num) ? +1 : -1;
    		}
    		return candidate;
    	}
    }

    这行代码绝了!!!count += (candidate == num) ? +1 : -1;

关于解法 3 还有一个很好理解的解释,来自于力扣kxACE转发的 youtube 视频,称为同归于尽消杀法

由于多数超过50%, 比如100个数,那么多数至少51个,剩下少数是49个。

遍历数组

  1. 第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,此时领主 winner 就是这个阵营的人,现存兵力 count = 1。
  2. 如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,领主不变,winner 依然是当前这个士兵所属阵营,现存兵力 count 加一;
  3. 如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽
    此时前方阵营兵力-1, 即使双方都死光,这块高地的旗帜 winner 不变,没有可以去换上自己的新旗帜。
  4. 当下一个士兵到来,发现前方阵营已经没有兵力,新士兵就成了领主,winner 变成这个士兵所属阵营的旗帜,现存兵力 count ++。
    就这样各路军阀一直厮杀以一敌一同归于尽的方式下去,直到少数阵营都死光,剩下几个必然属于多数阵营的,winner 是多数阵营。

(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

相关推荐
rannn_1118 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer8 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴9 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站9 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
IKUN家族10 小时前
Spring IoC&DI
java·spring·rpc
AI备案指南-满满10 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤10 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝10 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林10 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展