题目描述一

这是 LeetCode 上的「169. 多数元素」,难度为「简单」。

Tag : 「哈希表」、「摩尔投票」

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。

若没有,返回 -1 。请设计时间复杂度为 n、空间复杂度为1 的解决方案。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

方法一:使用哈希表

class Solution {public int majorityElement(int[] nums) {int n = nums.length;Map<Integer, Integer> map = new HashMap<>();for (int x : nums) {map.put(x, map.getOrDefault(x, 0) + 1);if (map.get(x) > n / 2) return x;}return -1;}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

方法二:摩尔投票

摩尔投票 :在集合中寻找可能存在的多数元素,这一元素在输入的序列重复出现并占到了序列元素的一半以上;在第一遍遍历之后应该再进行一个遍历以统计第一次算法遍历的结果出现次数,确定其是否为众数;如果一个序列中没有占到多数的元素,那么第一次的结果就可能是无效的随机元素。

换句话说,每次将两个不同的元素进行「抵消」,如果最后有元素剩余,则「可能」为元素个数大于总数一半的那个。

具体的,我们定义一个变量 x 来保存那个可能为主要元素的值,cnt用来记录该值的出现次数。然后在遍历数组 nums过程中执行如下逻辑:

如果 cnt为0:说明之前出现过的x已经被抵消完了,更新一下x为当前值,出现次数为1:x = nums[i], cnt = 1;
如果cnt不为0:说明之前统计的x还没被抵消完,这是根据 nums[i]与x是否相等进行计算即可:cnt += nums[i] == x ? 1 : -1。
当处理完nums之后,我们得到了一个「可能」的主要元素。注意只是可能,因为我们在处理过程中只使用了x和cnt来记录,我们是无法确定最后剩下的x是经过多次抵消后剩余的主要元素,还是只是不存在主要元素的数组中的无效随机元素。

因此我们需要再进行一次遍历,检查这个「可能」的主要元素x的出现次数是否超过总数一半。

代码:

class Solution {public int majorityElement(int[] nums) {int n = nums.length;int x = -1, cnt = 0;for (int i : nums) {if (cnt == 0) {x = i;cnt = 1;} else {cnt += x == i ? 1 : -1;}}cnt = 0;for (int i : nums) if (x == i) cnt++;return cnt > n / 2 ? x : -1;}
}

题目描述二

这是 LeetCode 上的「229. 多数元素二」,难度为「中等」。

Tag : 「哈希表」、「摩尔投票」

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

请设计时间复杂度为 n、空间复杂度为1 的解决方案。
示例 1:

输入:nums = [3,2,3]
输出:[3]

示例 2:

输入:nums = [1]
输出:[1]

直接用摩尔投票

class Solution {public List<Integer> majorityElement(int[] nums) {// 根据反证法可以证明最多有两个数大于n/3int n = nums.length;int a = -1, b = -1;         // a,b为当前可能计数>n/3的数int c1 = 0, c2 = 0;         // c1记录a的数量,c2记录b的数量for(int i : nums) {if(c1 != 0 && a == i)           // a之前出现过c1++;else if(c2 != 0 && b == i) c2++;else if(c1 == 0) {          // a位置没有数c1++;a = i;} else if(c2 == 0) {        // b位置没有数c2++;b = i;} else {c1--;c2--;}}c1 = 0;c2 = 0;for(int i : nums) {if(i == a)c1++;else if(i == b)c2++;}List<Integer> ans = new ArrayList<>();if(c1 > n/3)ans.add(a);if(c2 > n/3)ans.add(b);return ans;}
}

摩尔投票(包含题目讲解)相关推荐

  1. LeetCode 169. 求众数(摩尔投票)

    文章目录 1. 题目信息 2. 解题思路 3. 代码 3.1 排序 3.2 map计数 3.3 摩尔投票 1. 题目信息 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ ...

  2. 【LeetCode笔记】169. 多数元素(Java、摩尔投票法、哈希表)

    文章目录 题目描述 思路 & 代码 思路一:哈希表 思路二: 摩尔投票法 题目描述 好家伙,这是今天最有意思的题目了 思路 & 代码 思路一:哈希表 先说缺点:空间复杂度O(n) 一次 ...

  3. splay + 线段树 ---- P3765总统选举 [带修改的动态区间众数 摩尔投票+n棵splay]

    题目链接 题目大意: 解题思路: 1.摩尔投票法: 题意是找n个数内出现次数大于n/2的数 保证存在这个数用的方法叫做摩尔投票法 首先我们注意到这样一个现象: 在任何数组中,出现次数大于该数组长度一半 ...

  4. 动态规划和摩尔投票法

    动态规划 维基百科对动态规划(Dynamic programming,简称DP)的定义是一种在数学.管理科学.计算机科学.经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问 ...

  5. 摩尔投票法(力扣- -229. 求众数 II)

    摩尔投票法(力扣- -229. 求众数 II) 文章目录 摩尔投票法(力扣- -229. 求众数 II) 一.题目描述 二.分析 摩尔投票法 总结 三.代码 一.题目描述 二.分析 这道题如果用O(N ...

  6. LeetCode 229. 求众数 II(摩尔投票)

    1. 题目 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1). 示例 1: 输入: [3,2,3] 输出: ...

  7. 算法 摩尔投票算法(图解例题)

    摩尔投票算法 摩尔投票算法也叫多数投票算法 摩尔投票法,解决的问题是如何在任意多的候选人中,选出票数超过一半的那个人.注意,是超出一半票数的那个人. 假设投票是这样的,[A, C, A, A, B], ...

  8. 函数传参问题,桶排序去重,分治递归,摩尔投票求数组众数,数组中心下标求法

    TIPS 1. 我们都知道,地址,指针这两者是完全等价的概念,但是有微小的差别.地址的话是不能够修改的(比如说数组名++就是违法的),而指针的话可以++与--. 2. 以后一旦在代码里面看到字符cha ...

  9. 2020年 Moore majority vote algorithm 摩尔投票法知多少

    第一眼看到这个题目,想到的是使用Map来统计出现频次,然后遍历找出频次大于n/2的元素. class Solution {public int majorityElement(int[] nums) ...

  10. 摩尔投票法(Boyer–Moore majority vote algorithm)

    参考资料 论文MJRTY A Fast Majority Vote Algorithm 算法演示网站 维基百科 算法解读 概述 摩尔投票法(Boyer–Moore majority vote algo ...

最新文章

  1. python特性和属性_Python之属性、特性和修饰符
  2. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)
  3. CefSharp For WPF响应页面点击事件
  4. 手机APP测试几个要点
  5. Sublime Text 关闭自动更新
  6. 汇编工具安装三:已经配置好的汇编开发工具!
  7. 算法 --- 递归生成括号
  8. python做接口自动化如何输出测试报告-python生成接口自动化测试报告模版
  9. static关键字 void和void指针 函数指针
  10. 事务注解放到类上面 下面私有方法有效吗_【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)...
  11. rz/sz:工作原理
  12. 关于QT编译错误问题
  13. zookeeper集群搭建和API使用
  14. 6. JavaScript HTML DOM
  15. Android初学第9天
  16. PHP 微信网页授权开发
  17. 微信小程序弹框wx.showModal如何修改样式
  18. 复选框java_java之swing实现复选框的方法
  19. html图片自动切换的幻灯片效果的,JS实现可切换图片的幻灯切换效果示例
  20. echarts 之饼形图配置属性

热门文章

  1. 关于双硬盘安装双系统
  2. Epicor 调试 customization
  3. 项目管理之-WBS(Work Breakdown Structure, 工作分解结构)
  4. http://www.bluecoat.com.cn/resources/overview
  5. 绘制IRB1200机器人工作空间
  6. 计算机用户名携带中文路径,Win10 User下的中文用户名改成英文路径操作方法
  7. js——分享QQ、QQ空间、微信、微博
  8. 数据挖掘(一)A-Priori
  9. The Devil is in the Details: Self-Supervised Attention for Vehicle Re-Identification(翻译)
  10. 2020-09-03解决pip install安装非常慢[Errno 101] 网络不可达问题