【LeetCode】169. 多数元素

news/2024/11/14 21:06:55/

169. 多数元素(简单)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法一:sort排序,时间复杂度为O(nlogn)

思路

  • 我自己的写法用了最简单的方法,首先使用 sort() 对数组元素按照从小到大进行排序,然后依次遍历每个元素,如果该元素的出现次数大于 n/2 ,那么就返回该元素。

代码

class Solution {
public:int majorityElement(vector<int>& nums) {int n = nums.size();int cnt = nums.size() / 2;// 对元素按照从小到大进行排序sort(nums.begin(), nums.end());// 元素的出现次数int show = 1; for(int i=1; i<n; ++i){// 如果和前一个元素一样,出现次数加一if(nums[i] == nums[i-1]){show += 1; // 判断是否已经达到要求if(show > cnt)  return nums[i];}// 如果和前一个元素不同,重新计数else show = 1;}return nums[n-1];}
};
  • 我还是想复杂了,由于该元素出现次数大于 50% ,所以直接返回 nums 的中间元素即可。

代码

class Solution {
public:int majorityElement(vector<int>& nums) {int cnt = nums.size() / 2;sort(nums.begin(), nums.end());return nums[nums.size() / 2];}
};

方法二:优化 「 Boyer-Moore 投票算法」

思路

  • 题目的优化要求是 时间复杂度为O(n),空间复杂度为O(1) ,而我方法一使用了 sort() ,时间复杂度为O(nlogn),空间复杂度为O(n),显然无法满足要求。

  • Boyer-Moore 投票算法的思想类似于同归于尽消杀法

    由于多数超过50%, 比如100个数,那么多数至少51个,剩下少数是49个。

    第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,此时领主 winner 就是这个阵营的人,现存兵力 count = 1。

    如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,领主不变,winner 依然是当前这个士兵所属阵营,现存兵力 count++;

    如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽。 此时前方阵营兵力count --。(即使双方都死光,这块高地的旗帜 winner 依然不变,因为已经没有活着的士兵可以去换上自己的新旗帜)

    当下一个士兵到来,发现前方阵营已经没有兵力,新士兵就成了领主,winner 变成这个士兵所属阵营的旗帜,现存兵力 count ++。

    就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营,winner 就是多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

代码

class Solution {
public:int majorityElement(vector<int>& nums) {int winner = nums[0];int count = 1;for(int i=1; i<nums.size(); ++i){// 阵营没有人,新来的人默认成为新的winnerif(count == 0){winner = nums[i];count ++;}// 新来的人和winner同一阵营else if(nums[i] == winner){count ++;}// 新来的人和winner不同阵营 那么需要抵消一个else{count --;}}return winner;}
};

参考资料

  1. 官方题解
  2. 视频讲解[java]

http://www.ppmy.cn/news/82251.html

相关文章

代码随想录算法训练营第四十八天 | 树形dp

198.打家劫舍 文档讲解&#xff1a;代码随想录 (programmercarl.com) 状态&#xff1a;看了“决定dp[i]的因素才做出来"。 思路 当前房屋偷与不偷取决于 前一个房屋和前两个房屋是否被偷了。 所以这里就更感觉到&#xff0c;当前状态和前面状态会有一种依赖关系&#xf…

C语言CRC-16 DNP格式校验函数

C语言CRC-16 DNP格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范通过对输…

622. 设计循环队列

622. 设计循环队列 Java实现循环队列设计 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我…

mysql执行计划explain

mysql 执行计划 explain 介绍 mysql8.0为例&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/explain-output.html EXPLAIN为语句中使用的每个表返回一行信息 SELECT。它按照 MySQL 在处理语句时读取它们的顺序列出输出中的表。这意味着 MySQL 从第一个表中读取一行&…

牛牛截图控件与利洽远程控制产品升级-支持证书自动升级

今天我们来聊一聊浏览器控件的一个痛点&#xff01;看看我们是如何解决他的。 背景信息 目前市面上存在多种浏览器&#xff0c;IE、Chrome、Firefox、Edge以及一众国产浏览器&#xff0c;这些浏览器中&#xff0c;IE支持ActiveX&#xff0c;部分国产浏览器支持npapi&#xff…

前端架构师-week7-B端项目需求分析和架构设计

标题 B端项目需求分析 和 架构设计 将收获什么 做怎样的项目完成瓶颈期的突破 怎样从需求中寻找关键难点 怎样写技术解决方案 怎样进行基础的技术选型 关键词 挖掘难点 - 找到项目中的痛点 技术解决方案 - 以文档的形式创造可追溯的思考模型 业务组件库 - 多项目复用的业务组…

LIN-报文结构

文章目录 协议规范一、字节场二、报文头&#xff08;HEADER FIELDS&#xff09;同步间隔&#xff08;synchronisation break)同步场&#xff08;SYNCH FIELD&#xff09;标识符场&#xff08;IDENTIFIER FIELD&#xff09; 三、数据场&#xff08;DATE FIELDS&#xff09;四、校…

1096 Consecutive Factors(22行代码+详细注释)

分数 20 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3567, where 5, 6, and 7 are the three consecutive numbers. Now g…