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

摩尔投票算法--169. 多数元素

169. 多数元素

普通方法-借助map计数

class Solution {
public:int majorityElement(vector<int>& nums) {map<int,int> mp;for(int num :nums){mp[num]++;}for(auto &a :mp){if(a.second>nums.size()/2){return a.first;}}return 0;}
};

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

 

-----摩尔投票:Boyer-Moore 投票算法只能在数组中存在一个多数元素且该元素的出现次数严格超过数组长度的一半时有效。

class Solution {
public:int majorityElement(vector<int>& nums) {int ans=nums[0],count=0;for(int i=0;i<nums.size();i++){if(count==0) ans=nums[i];if(nums[i]==ans)count++;else count--;}return ans;}
};

代码逻辑解释:

  1. 初始化

    • ans = nums[0]ans 是当前的候选多数元素,初始化为数组的第一个元素。
    • count = 0count 是计数器,用来记录当前候选元素的优势(即它的相对出现次数)。
  2. 遍历数组

    • for(int i = 0; i < nums.size(); i++):遍历数组中的每个元素。
  3. 判断当前元素是否为候选多数元素

    • if(count == 0) ans = nums[i];:当计数器为 0 时,表示当前没有有效的候选多数元素,因此将当前元素 nums[i] 设为新的候选元素 ans
  4. 更新计数器

    • if(nums[i] == ans) count++;:如果当前元素等于候选元素 ans,增加计数 count
    • else count--:如果当前元素不等于候选元素 ans,减少计数 count
  5. 返回结果

    • 最终返回 ans,即数组中的多数元素。

为什么算法有效?

该算法利用了一个事实:多数元素的出现次数超过了一半,即出现次数比其他所有元素的总和都多。在遍历数组时,每当遇到多数元素时,计数器增加;当遇到其他元素时,计数器减少。当计数器为 0 时,意味着之前的候选元素不再具备多数的可能性,此时更新候选元素为当前元素。

因为多数元素的出现次数超过了数组长度的一半,最终剩下的候选元素一定是多数元素。

举个例子:

假设 nums = [2, 2, 1, 1, 1, 2, 2],我们一步步执行代码:

  • 初始:ans = 2count = 0
  • i = 0:当前元素 2count == 0,设置 ans = 2count++ -> count = 1
  • i = 1:当前元素 2,等于 anscount++ -> count = 2
  • i = 2:当前元素 1,不等于 anscount-- -> count = 1
  • i = 3:当前元素 1,不等于 anscount-- -> count = 0
  • i = 4:当前元素 1count == 0,设置 ans = 1count++ -> count = 1
  • i = 5:当前元素 2,不等于 anscount-- -> count = 0
  • i = 6:当前元素 2count == 0,设置 ans = 2count++ -> count = 1

最后 ans = 2,返回的结果即为多数元素 2

总结:

  • 时间复杂度:O(n),只需遍历数组一次。
  • 空间复杂度:O(1),只用到了固定数量的变量。

 


http://www.mrgr.cn/news/23610.html

相关文章:

  • 解锁精准电商营销新纪元:深度剖析京东商品详情API数据驱动的营销策略
  • 请问什么样的文献管理软件比较好用,用了zotero发现不会用?
  • 陶建辉演讲干货分享,AI 时代下的数据预测和数据处理挑战
  • Linux CentOS更换阿里云源解决Could not retrieve mirrorlist http://mirrorlist.centos.org
  • 笔试强训day07
  • 电信AEP平台WEB在线开发经验总结
  • 基于单片机一种风速测量仪的设计
  • 判断语句(C语言)
  • 01:电子移动速度/电阻大小与功率大小
  • (一)NoSQL之 【Redis配置】
  • 比较:#define,const,typedef
  • 为什么HashTable慢? 它的并发度是什么? 那么ConcurrentHashMap并发度是什么?
  • AI在医学领域:HMARL首个多器官诊断AI框架
  • 智能交通(三)——Elsevier特刊推荐
  • Redis中String类型的基本命令
  • 漏洞挖掘 | 某系统中少见的前端登录校验
  • Selenium与Qt应用:自动化与GUI结合实践
  • 【运维方案】信息系统运维方案(Word完整版)
  • 灭火器目标检测数据集 3700张 灭火器 带标注 voc yolo
  • 请解释Java中的深拷贝和浅拷贝的区别。什么是Java中的代理模式?它有什么作用?