当前位置: 首页 > news >正文

力扣经典算法篇-5-多数元素(哈希统计,排序,摩尔投票法)

题干:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入:nums = [3,2,3]
输出:3

示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2

提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109

解题:
(1)、哈希统计法
定义一个hash接口,如HashMap,统计每个元数出现的次数。之后在遍历HashMap获取次数最大的元素即可。这个方法是最容易想到,且最通用的方法。
代码示例:(java)

public static int majorityElement(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }

        Map<Integer, Integer> map = new HashMap<>();      // 统计元素出现的次数
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }

        int count = 0;         // 暂存出现最大的次数
        int key = nums[0];      // 最大次数对应的元素值
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() > count) {
                key = entry.getKey();
                count = entry.getValue();
            }
        }
        return key;
    }

(2)、排序法
因为题干要说明了超过n/2的元素。所以对数组排序后,众数一定会在最中间的位置。
可以结合上面参考的几个示例,在有序和无序的情况下,自己思考一下。
代码示例:

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

(3)、摩尔投票法
摩尔投票法的核心理念为 票数正负抵消 。
推论一: 若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 >0 。
推论二: 若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0 ,即后 (n−a) 个数字的 众数仍为 x 。

思考一下:

  • 当候选元素为众数时,根据推论一遇到众数+1,非众数-1,结果一定大于0,因为众数至少超过了n/2。
  • 当候选元素不是众数时,先不考虑其他元素的影响,仅众数的影响就可以将这个候选元素递减到0,而且最终剩余的数组中肯定还是众数出现的次数最多。
    (前面递减的过程理解下:最坏也是消除同等数量的众数和普通元素,剩余的部分肯定还是众数多,听到这里,想明白了没?_

代码示例:

public static int majorityElement(int[] nums) {
        int temp = 0;
        int votes = 0;
        for (int i = 0; i < nums.length; i++) {
            if (votes == 0) {
                temp = nums[i];
            }
            votes += (temp == nums[i] ? 1 : -1);
        }
        return temp;
    }

逆风翻盘,Dare To Be!!!

相关文章:

  • CES Asia 2025:行业话语权的逐鹿高地
  • 如何利用系统的数据分析能力提高利润额?
  • websocket获取客服端真实ip
  • Linux | I.MX6ULL 终结者底板原理图讲解(5)
  • 最新万能场馆预约系统源码 基于ThinkPHP+UniApp 含图文搭建部署教程
  • Python+新版DeepSeek V3轻松开发Agent
  • Unity跨平台输入系统
  • Doris Streamloader安装教程
  • LeetCode 78.子集
  • 字符函数,日期函数笔记
  • QinQ-端口安全
  • 【54】结构体:结构体指针的内存与通信
  • Qt信号槽
  • 3D设计在UI中的应用:2025年的设计新潮流!
  • OpenMCU(五):STM32F103时钟树初始化分析
  • 黑帽SEO之搜索引擎劫持-域名劫持原理分析
  • 银发浪潮下的智能护理革命:全球老龄化社会护理机器人发展研究
  • AI时代新坐标!火石会:应时而生,聚势而为
  • AI推理胜过人脑?思维模型!【34】长线思考思维模型
  • 普冉单片机PY32F002BF,使用adc内部参考电压VREFINT检测。
  • 做一手楼房的网站/廊坊seo网络推广
  • 营销型网站建设页面/百度网址大全下载到桌面
  • 企业网站备案信息/网站设计开发网站
  • 视频做网站/如何建一个自己的网站
  • 斗鱼网站的实时视频是怎么做的/网上国网app推广方案
  • 网站提供商/网络安全培训机构哪家好