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

算法与数据结构(多数元素)

题目

思路

方法一:哈希表

因为要求出现次数最多的元素,所以我们可以使用哈希映射存储每个元素及其出现的次数。每次记录出现的次数若比最大次数大,则替换。

方法二:摩尔算法

摩尔的核心算法就是对抗,因为存在次数多于一半的数,不同的元素相互抵消,那么剩下的一定就是出现次数最多的那个数。

比如,假设数组是[3,2,3]。初始时,candidate是-1,count是0。第一个元素是3,这时候num不等于candidate(-1),所以执行else if的条件。count减1的话,这时候count是-1,是否满足小于0?是的。于是将candidate设为3,count设为1。接下来是第二个元素2。这时候num不等于3,所以count减1,变成0。这时候count不满足小于0,所以不做任何改变。第三个元素是3,等于candidate,所以count加1,变成2。最后返回3。

这个算法的正确性在于,当存在多数元素时,即使中间阶段被其他元素暂时替代,最终剩下的candidate还是多数元素。因为多数元素的个数超过一半,所以无论如何抵消,最后剩下的肯定是多数元素。

这个算法的核心就是是,每次遇到不同的元素,就减少count,当count减到负的时候,更换候选者。这其实相当于在每一步中,当前的候选者和其他元素进行对抗,如果当前候选者不足以支撑(count被抵消到负),就换新的候选者。这样最终剩下的候选者就是多数元素。

代码

1.哈希表

class Solution {
public:
    int majorityElement(vector<int>& nums) 
    {
        unordered_map<int,int> Hashmap;
        int value=0,freq=0;
        for(int i=0;i<nums.size();i++)
        {
            Hashmap[nums[i]]++;
            if(Hashmap[nums[i]] > freq)
            {
                value = nums[i];
                freq = Hashmap[nums[i]];
            }
        }
        return value;
    }
};

2.摩尔算法

class Solution {
public:
    //摩尔算法
    int majorityElement(vector<int>& nums) 
    {
        int candidate=-1,count=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==candidate)
            {
                count++;
            }
            else if(--count < 0)
            {
                candidate = nums[i];
                count = 1;
            }
        }
        return candidate;
    }
};

http://www.dtcms.com/a/17429.html

相关文章:

  • 数据可视化+SpringBoot+协同过滤推荐算法的美食点餐管理平台
  • 消息队列之-springcloud-mq-stream 学习
  • 开发基础(8):鸿蒙图表开发
  • C++之线程池(Thread Pool)
  • 数智化时代的工单管理:从流程驱动到数据驱动-亿发
  • 【测试开发】Python+Django实现接口测试工具
  • DeepSeek自动批量写作的AI软件
  • WIN11上使用GraalVM打包springboot3项目为本地可执行文件exe
  • 笔试-士兵过河
  • android 的抓包工具
  • Vue 入门到实战 十
  • 【算法】【位运算】acwing算法基础 801. 二进制中1的个数
  • 计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计
  • 开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~
  • Python学习笔记 ver1.0
  • vue3 ref/reactive 修改数组的方法
  • 数据结构——红黑树的实现
  • Github Action自动流翻译README文档【CI/CD】
  • npm install 失败
  • 利用盲注技术获取表、列、具体数据
  • 英码科技基于昇腾算力实现DeepSeek离线部署
  • 日本股市概览:主要指数、经济泡沫与现代市场趋势(中英双语)
  • 深入理解C#结构型设计模式:类适配器与对象适配器
  • 公网IP、私网IP、动态IP、静态IP
  • ubuntu 实时系统安装Nvidia驱动
  • 网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施
  • 08模拟法 + 技巧 + 数学 + 缓存(D1_模拟法)
  • 信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化
  • 基于JavaWeb开发的Java+Spring+vue+element实现旅游信息管理平台系统
  • DeepSeek 可视化部署手册:环境配置与运维指南