想要精通算法和SQL的成长之路 - 摩尔投票法的运用

想要精通算法和SQL的成长之路 - 摩尔投票法的运用

  • 前言
  • 一. 多数元素
    • 1.1 摩尔投票法
  • 二. 多数元素II
    • 2.1 分析

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 多数元素

原题链接
在这里插入图片描述

1.1 摩尔投票法

简单来说,假设数组 num 的众数是 x,数组长度为n
有两个推论:

  • 我们有一个票数和为sum,若记众数的票数为 +1 ,非众数的票数为 −1 ,则一定有所有数字的票数和 sum >0
  • 如果数组的前 m 个数字的票数和为0,那么剩余的(n-m) 个数字的票数和一定 > 0,并且后面(n-m)个数字中的众数依旧是x

那么针对本题目,求得的是多数元素,其出现次数超过数组元素个数的一半。思路如下:

  • 我们设置当前众数为:res。初始化为数组第一元素。
  • 设置当前票数和为:vote。初始化为0
  • 遍历数组:如果票数和为0,更新众数为当前元素。
  • 每次遍历,都对票数做统计,是众数,则+1,否则-1。

结果如下:

public int majorityElement(int[] nums) {int res = nums[0], vote = 0;for (int num : nums) {if (vote == 0) {res = num;}vote += (res == num) ? 1 : -1;}return res;
}

二. 多数元素II

原题链接
在这里插入图片描述
在原题的基础上,不再是求出现次数超过2分之一的多数元素了。而是三分之一。即本题的返回个数最多有两个。

2.1 分析

我们这里这里假设:有两个(并且最多只有两个)符合题目条件的元素:x 和 y。他们的票数分别是v1 和 v2。

  1. 利用摩尔投票法,确定两个候选数。因为我们这里假设的是2个都满足条件,但是实际情况可能只有一个或者没有。这里只是求得:出现次数最多的前两个数是哪几个(实际他们的出现次数却不知道)
  2. 最后再对这两个候选人做计数统计,统计他们分别出现的次数是多少,是否满足题目要求。

阶段一:摩尔投票阶段,决定出现次数最多的前两个数:

// 初始化两个候选数和对应票数
int x = nums[0], y = nums[0];
int v1 = 0, v2 = 0;
// 摩尔投票,求得出现次数最多的两个数
for (int num : nums) {// 如果当前数和x一样if (x == num) {v1++;continue;}// 如果当前数和x一样if (y == num) {v2++;continue;}// 第一个候选票数为0了,那么当前数认定为第一个候选数if (v1 == 0) {x = num;v1++;continue;}// 第二个候选 同理if (v2 == 0) {y = num;v2++;continue;}// 否则,都不满足两个候选,两个候选的票数同时-1v1--;v2--;
}

这时候,我们拿到票数最多的两个元素,x和y。他们可能是同一个元素,也可能不是同一个元素。

接下来进入阶段二,统计票数阶段:

// 阶段二:统计票数阶段
v1 = 0;
v2 = 0;
for (int num : nums) {if (num == x) {v1++;} else if (num == y) {v2++;}
}

注意:不能这么写:(两个数如果是同一个,那就重复了)

for (int num : nums) {if (num == x) {v1++;}if (num == y) {v2++;}
}

最后,判断他们的出现次数是否满足条件,满足则加入结果集,所有代码如下:

public List<Integer> majorityElement(int[] nums) {ArrayList<Integer> res = new ArrayList<>();if (nums == null || nums.length == 0) {return res;}// 初始化两个候选数和对应票数int x = nums[0], y = nums[0];int v1 = 0, v2 = 0;// 摩尔投票,求得出现次数最多的两个数for (int num : nums) {// 如果当前数和x一样if (x == num) {v1++;continue;}// 如果当前数和x一样if (y == num) {v2++;continue;}// 第一个候选票数为0了,那么当前数认定为第一个候选数if (v1 == 0) {x = num;v1++;continue;}// 第二个候选 同理if (v2 == 0) {y = num;v2++;continue;}// 否则,都不满足两个候选,两个候选的票数同时-1v1--;v2--;}// 阶段二:统计票数阶段v1 = 0;v2 = 0;for (int num : nums) {if (num == x) {v1++;} else if (num == y) {v2++;}}// 最后看看是否超过了三分之一if (v1 > nums.length / 3) {res.add(x);}if (v2 > nums.length / 3) {res.add(y);}return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/191118.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows Oracle Database 19c 卸载教程

目录 打开任务管理器 停止数据库服务 Universal Installer 卸载Oracle数据库程序 使用Oracle Installer卸载 删除注册表项 重新启动系统 打开任务管理器 ctrlShiftEsc可以快速打开任务管理器&#xff0c;找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前&a…

Linux操作

linux下的sh文件变成可执行文件&#xff08;可执行文件有颜色&#xff08;默认绿色&#xff09;&#xff09; chmod 777 xxx.sh Linux系统下给.sh添加可执行权限并运行 1、添加可执行权限 chmod ux xxx.sh 解释&#xff1a; chmod(change the permissions mode of a file)是…

强化学习各种符号含义解释

&#xff1a;状态 : 动作 : 奖励 : 奖励函数 : 非终结状态 : 全部状态&#xff0c;包括终结状态 : 动作集合 ℛ : 奖励集合 : 转移矩阵 : 离散时间步 &#xff1a; 回合内最终时间步 : 时间t的状态 : 时间t动作 : 时间t的奖励,通常为随机量&#xff0c;且由和决定 : 回报 : n步…

10-19 HttpServletResponse

相应的对象 web开发模型&#xff1a;基于请求与相应的模型 一问一答的模型 Response对象:响应对象,封装服务器给客户端的相关的信息 顶级接口: ServletResponse 父接口:HttpServletResponse response对象的功能分为以下四种:(都是服务器干的事注意) 设置响应头信息; 发送状态码…

软件工程师参加技术峰会,带来的价值,你想象不到!

参加技术大会是软件开发人员了解行业最新技术和未来发展趋势的重要途径。 在技术大会上&#xff0c;来自世界各地的专家、学者和企业代表会分享他们的最新研究成果、技术创新和趋势分析。这对于软件开发人员来说&#xff0c;是一个宝贵的学习机会&#xff0c;可以帮助他们拓宽…

动手学深度学习——循环神经网络(原理解释与代码详解)

文章目录 一、循环神经网络1. 无隐状态的神经网络2. 有隐状态的循环神经网络3. 基于循环神经网络的字符级语言模型4. 困惑度5. 小结 二、循环神经网络的从零开始实现1. 独热编码2. 初始化模型参数3. 循环神经网络模型4. 预测5. 梯度裁剪6. 训练 一、循环神经网络 n元语法模型&…

竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

记录一些涉及到界的题

文章目录 coppersmith的一些相关知识题1 [N1CTF 2023] e2Wrmup题2 [ACTF 2023] midRSA题3 [qsnctf 2023]浅记一下 coppersmith的一些相关知识 上界 X c e i l ( 1 2 ∗ N β 2 d − ϵ ) X ceil(\frac{1}{2} * N^{\frac{\beta^2}{d} - \epsilon}) Xceil(21​∗Ndβ2​−ϵ) …

sqli-labs关卡19(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第十九关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

【MySQL】索引与事务

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

深入解析:开发抖音酒店景区小程序的技术

抖音作为社交媒体平台的佼佼者&#xff0c;其独特的风格和用户基础吸引了无数开发者的目光。在本文中&#xff0c;我们将深入解析开发抖音酒店景区小程序的关键技术&#xff0c;为开发者提供实用指南。 1.抖音风格设计 在开发酒店景区小程序时&#xff0c;首先要注重界面设计…

Linux:firewalled服务常规操作汇总

一、firewalled防火墙工作原理 firewalled的内部结构&#xff0c;可以简单的看做下图&#xff0c;有两个集合&#xff0c;一个集合管理关闭的端口&#xff0c;另一个集合管理放开的端口。 二、常用操作 1、开启和关闭防火墙 临时性配置&#xff1a; systemctl [start | stop …