码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间


    229. 多数元素 II - 力扣(LeetCode)


    给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

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


    (1)哈希表

    1. class Solution {
    2. public:
    3. // 哈希
    4. vector<int> majorityElement(vector<int>& nums) {
    5. unordered_map<int,int> mp;
    6. for(const int& a:nums) mp[a]++;
    7. int n = nums.size() / 3;
    8. int i=0;
    9. vector<int> ans;
    10. for(auto &it:mp) {
    11. if(it.second > n) ans.push_back(it.first);
    12. }
    13. return ans;
    14. }
    15. };

    (2) 摩尔投票法

    推荐看这篇文章,有关摩尔投票法的介绍:229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/123170/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/① k=1时,举个栗子

    • 初始化

    • 执行流程 

    ② k=2时,举个栗子 

    • 初始化

    1. class Solution {
    2. public:
    3. // 摩尔投票法
    4. vector<int> majorityElement(vector<int>& nums) {
    5. // 创建返回值
    6. vector<int> res;
    7. if (nums.empty() || nums.size() == 0) return res;
    8. // 初始化两个候选人candidate,和他们的计票
    9. int cand1 = nums[0],count1 = 0;
    10. int cand2 = nums[0],count2 = 0;
    11. // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
    12. // (1) 配对阶段
    13. for(const int &num : nums) {
    14. // 投票
    15. if(cand1 == num) {count1++;continue;}
    16. if(cand2 == num) {count2++;continue;}
    17. // 第 1 个候选人配对
    18. if(count1 == 0) {
    19. cand1 = num;
    20. count1++;
    21. continue;
    22. }
    23. // 第 2 个候选人配对
    24. if(count2 == 0) {
    25. cand2 = num;
    26. count2++;
    27. continue;
    28. }
    29. count1--;
    30. count2--;
    31. }
    32. // (2)计数阶段 : 找到了两个候选人之后,需要确定票数是否满足大于 N/3
    33. count1=0;
    34. count2=0;
    35. for(const int &num : nums) {
    36. if (cand1 == num) count1++;
    37. else if (cand2 == num) count2++;
    38. }
    39. if (count1 > nums.size() / 3) res.push_back(cand1);
    40. if (count2 > nums.size() / 3) res.push_back(cand2);
    41. return res;
    42. }
    43. };

    (3)进阶版 k值投票法

    1. class Solution {
    2. public:
    3. // k值摩尔投票法
    4. int k = 3;
    5. vector<int> majorityElement(vector<int>& nums) {
    6. // 创建返回值
    7. vector<int> res;
    8. if (nums.empty() || nums.size() == 0) return res;
    9. if (nums.size() == 1) return nums;
    10. int n = k-1, m = 2, cands[n][m];
    11. memset(cands, 0, sizeof(cands));
    12. for(int i=0;i
    13. cands[i][0]=nums[0];
    14. // cands[i][1]=0;
    15. }
    16. // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
    17. bool voteflag=0;
    18. bool matchflag = 0;
    19. for(const int &num : nums) {
    20. for(int i=0;i
    21. // 投票
    22. if(cands[i][0] == num) {cands[i][1]++;voteflag=1;break;}
    23. else voteflag=0;
    24. }
    25. if(voteflag) continue;
    26. for(int i=0;i
    27. // 第 i 个候选人配对
    28. if(cands[i][1] == 0) {
    29. cands[i][0] = num;
    30. cands[i][1]++;
    31. matchflag=1;
    32. break;
    33. }
    34. else matchflag=0;
    35. }
    36. if(matchflag) continue;
    37. for(int i=0;i
    38. cands[i][1]--;
    39. }
    40. }
    41. // (2) 计数阶段
    42. for(int i=0;i
    43. if(cands[i][1]==0) cands[i][0] = INT_MAX;
    44. cands[i][1]=0;
    45. }
    46. for(const int &num : nums) {
    47. for(int i=0;i
    48. if (cands[i][0] == num ) {
    49. cands[i][1]++;
    50. }
    51. }
    52. for(int i=0;i
    53. if (cands[i][1] > nums.size() / k ) res.push_back(cands[i][0]);
    54. }
    55. return res;
    56. }
    57. };

    总结来自作者:我脱下短袖

    • 如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;
    • 如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;
    • 如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。
    • 所以以后碰到这样的问题,而且要求达到线性的时间复杂度以及常量级的空间复杂度,直接套上摩尔投票法。

    作者:我脱下短袖
    链接:https://leetcode.cn/problems/majority-element-ii/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    推荐和参考文章:

    229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/123170/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/1060343/gong-shui-san-xie-noxiang-xin-ke-xue-xi-ws0rj/

  • 相关阅读:
    访问Windows 11恢复环境的5种简单方法
    VINS学习(二)IMU预积分原理与实现
    Android使用高德地图实现运动轨迹绘制和轨迹回放
    ubantu 安装openssh
    vue + openlayer 按路径移动
    算法对树进行广度优先算法
    Vue CLI 3 - 创建我们的项目
    人工智能基础 | 机器学习模型评估与选择(二)
    git push报错解决
    经济利益是黑客攻击主要驱动力
  • 原文地址:https://blog.csdn.net/weixin_41987016/article/details/134097586
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号