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

leetCode 169. 多数元素 + 摩尔投票法

169. 多数元素 - 力扣(LeetCode)


给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 

大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。



class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int cand1=0,votes=0;
        for(const int& num:nums) {
            if(votes == 0) cand1 = num;
            // if(cand1 == num) votes++;
            // else votes--;
            votes += (cand1 == num) ? 1 : -1;
        }
        return cand1;
    }
};

k值摩尔投票法:(推导看我的往期文章)leetCode 229. 多数元素 II + k值摩尔投票法 + 进阶 + 优化空间-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134097586?spm=1001.2014.3001.5501

class Solution {
public:
    // k值摩尔投票法
    int k=2;
    int majorityElement(vector<int>& nums) {
        // 创建返回值
        vector<int> res;
        // if (nums.empty() || nums.size() == 0) return res;
        if (nums.size() == 1) return nums[0];
        int n = k-1, m = 2, cands[n][m];
        memset(cands, 0, sizeof(cands));
        for(int i=0;i<n;i++) {
            cands[i][0]=nums[0];
            // cands[i][1]=0;
        }

        // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
        bool voteflag=0;
        bool matchflag = 0;
        for(const int &num : nums) {
            // 给候选人投票
            for(int i=0;i<n;i++) {
                if(cands[i][0] == num) {cands[i][1]++;voteflag=1;break;}
                else voteflag=0;//投票失败
            }
            // 有某个候选人得票
            if(voteflag) continue;
            
            // 候选人配对
            for(int i=0;i<n;i++) {
                if(cands[i][1] == 0) {
                    cands[i][0] = num;
                    cands[i][1]++;
                    matchflag=1;
                    break;
                }
                else matchflag=0;
            }
            if(matchflag) continue;

            for(int i=0;i<n;i++) {
                cands[i][1]--;
            }
        }
        // (2) 计数阶段
        for(int i=0;i<n;i++) {
            if(cands[i][1]==0) cands[i][0] = INT_MAX;
            cands[i][1]=0;
        }
        for(const int &num : nums) {
            for(int i=0;i<n;i++) 
                if (cands[i][0] == num ) {
                    cands[i][1]++;
                }
        }
        for(int i=0;i<n;i++) {
            if (cands[i][1] > nums.size() / k ) res.push_back(cands[i][0]);
        }
        return res[0];//这里因为题目要求返回int,有需要可以返回vector
    }
};

我的往期文章:

LCR 158. 库存管理 II 哈希 / 摩尔投票法-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134094319?spm=1001.2014.3001.5501

相关文章:

  • C# 图解教程 第5版 —— 第13章 数组
  • HTTPS协议:保障网络安全的加密通信协议
  • vue 路由懒加载,图片懒加载,组件懒加载
  • Steger算法实现结构光光条中心提取(python版本)
  • 2023.10.28 关于 synchronized 原理
  • Ubuntu编译 PCL 1.13.1 详细流程
  • 嵌入式系统>嵌入式硬件知识
  • OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程
  • gradle多模块依赖管理最佳实践
  • 基于STM32的示波器信号发生器设计
  • 软考 系统架构设计师系列知识点之设计模式(6)
  • 阿里云/腾讯云国际站代理:阿里云服务器介绍
  • Docker:数据卷挂载
  • 「实验记录」CS144 Lab0 networking warmup
  • 永恒之蓝漏洞 ms17_010 详解
  • uniapp开发小程序—根据生日日期计算年龄 周岁
  • Web入门笔记
  • iOS iGameGuardian修改器检测方案
  • JDBC与MySql数据库
  • 软考下午第一题 案列分析
  • 域名空间网站怎么做/客服网站搭建
  • 公司网站制作费计入会计什么科目/北京百度快速优化排名
  • 旅游建设投资公司网站/百度竞价托管代运营公司
  • 凡科快图网站/直通车关键词优化口诀
  • 香河做网站/数字营销策划
  • 东城网站制作公司/企业培训机构