如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
题目链接
LeetCode 229. 求众数 II[1]
题目描述
给定一个大小为
说明:
- 要求算法的时间复杂度为
,空间复杂度为。
示例1
输入:
[3,2,3]
输出:
3
示例2
输入:
[1,1,1,3,3,2,2,2]
输出:
[1,2]
题解
这是求解众数的升级版:【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数[2] 但是这题没有保证一定存在满足条件的数,不过不要紧。
首先可以肯定最多有两个数的数量超过 1/3
,这个就不用我过多解释了吧。然后我们只需要找出出现次数最多的两个数,看它俩次数是否超过 1/3
就行了。
那么怎么找呢?如果存在某个数超过 1/3
,那我们每次删掉三个不同的数,直到最后没法删,最后剩下的数一定有这个超过 1/3
的数。原因很简单,因为每删一次最多删掉一个这个数,而删除最多 1/3
数组长度次之后所有数都被删光了,但是这个数还剩下一点。
所以我们用两个变量 cand1
和 cand2
表示两个候选人,cnt1
和 cnt2
表示两个候选人数量。那么如果两个候选人有一个和当前数 x
相同,对应的数量就加一。否则的话如果如果有某个候选人为空,就让 x
顶替成为新的候选人。否则的话就说明两个候选人都有,并且 x
和它俩都不相同,那么就同时删除三个不同的数,也就是两个候选人数量各减一,同时删去 x
。
最后判断两个候选人数量是否超过了 1/3
就行了。
这里关键点就在于,每次删除三个不同的数,判断最后剩下的数是否符合题意就行了。
代码
c++
class Solution {public:vector<int> majorityElement(vector<int>& nums) {int n = nums.size();int cand1 = 0, cand2 = 0, cnt1 = 0, cnt2 = 0;for (auto x : nums) {if (cand1 == x) {cnt1++;} else if (cand2 == x) {cnt2++;} else if (!cnt1) {cand1 = x;cnt1++;} else if (!cnt2) {cand2 = x;cnt2++;} else {cnt1--;cnt2--;}}cnt1 = cnt2 = 0;for (auto x : nums) {if (x == cand1) cnt1++;else if (x == cand2) cnt2++;}vector<int> res;if (cnt1 > n/3) res.push_back(cand1);if (cnt2 > n/3) res.push_back(cand2);return res;}
};
python
class Solution:def majorityElement(self, nums: List[int]) -> List[int]:n = len(nums)cand1, cand2, cnt1, cnt2 = 0, 0, 0, 0for x in nums:if cand1 == x:cnt1 += 1elif cand2 == x:cnt2 += 1elif cnt1 == 0:cand1 = xcnt1 = 1elif cnt2 == 0:cand2 = xcnt2 = 1else:cnt1 -= 1cnt2 -= 1cnt1 = cnt2 = 0for x in nums:if x == cand1:cnt1 += 1elif x == cand2:cnt2 += 1res = []if cnt1 > n//3:res.append(cand1)if cnt2 > n//3:res.append(cand2)return res
关注【算法码上来】,每日算法干货马上就来!
参考资料
[1]
LeetCode 229. 求众数 II: https://leetcode-cn.com/problems/majority-element-ii/
[2]
【每日算法Day 90】5种方法:求解数组中出现次数超过一半的那个数: https://godweiyang.com/2020/04/04/leetcode-inteview-39/
如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数相关推荐
- 如何判断数组所有数都不等于一个数_工程师编程,C语言学习,关于数组方面的一些总结...
在学习编程语言时,无论如何我们都逃不掉关于数组这个问题. 那么,在谈及这个问题时,我会从三个方面来思考: 1.数组的定义是什么,也就是何为数组? 2.如何在数组中填充元素(数据)? 3.如何用数组来解 ...
- 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...
题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...
- 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...
题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...
- 如何表示数组所有数都不等于一个数_力扣刷题那些事儿(3)-缺失的第一个正整数(41)...
问题描述 官网题目地址: 力扣leetcode-cn.com 问题分析 典型的 "看起来很简单" 的题目,但再仔细看发现要求时间复杂度和空间复杂度要求就知道自己错了. 简单描述就 ...
- LeetCode简单题之有序数组中出现次数超过25%的元素
题目 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10 ...
- LeetCode 1287. 有序数组中出现次数超过25%的元素
1. 题目 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7 ...
- 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组
152. 乘积最大子数组leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...
- 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...
- 寻找数组中出现次数超过一半的数字
[题 目]数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字.[思 路1]由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我 ...
最新文章
- BIZTALK项目中WEB引用WEBSERVICES服务时候报错
- php expat+DOM+SimpleXML XML读取
- IDEA在当前类中查找方法快捷键--转
- KindEditor js 路径修改及表单提交注意事项
- 2017.9.25 随机数生成器 失败总结
- [AaronYang]C#人爱学不学[1]
- cadence入门学习
- 华为交换机导入配置_华为交换机配置导入和导出
- 一位码农的人生自述(四十九)------大二学年自我总结
- 孙德顺敛财10亿,看图挖掘计算如何穿透与识别多层嵌套影子公司!
- netty编解码之jboss marshalling
- 给未来写封信app服务器维护中,App Store 上的“给未来写封信”
- matlab xfoil计算风力,低风速长叶片风力机翼型气动分析及优化研究
- Docker - 编译安装nginx镜像
- 双重否定表肯定,所以死鬼是活人吗?
- 测试cpu新旧软件,Revit2021 VS Revit2020新旧版本软件性能评测
- openfoam 源代码解析
- 【程序】STM32H743ZI用SDMMC2驱动88W8801 WiFi模块
- 服务器开远程桌面 开端口,Windows服务器远程桌面端口号如何修改
- Shakti是什么?
热门文章
- RabbitMQ的Work模式
- mfc 找到字符串中字符_利用滑动窗口解LeetCode438题:找到字符串中所有字母异位词...
- fvdm 跟驰模型 matlab仿真_【新书推荐】【2009.01】控制系统MATLAB计算及仿真(第3版)(黄忠霖)...
- Keras保存和载入训练好的模型和参数
- Failed to invoke the method subscribe in the service com.alibaba.dubbo.registry.RegistryService
- Java二叉树的构建与遍历
- 【JavaSE03】Java中分支语句-练习
- MongoDB从立地到成佛(介绍、安装、增删改查)
- 为 springboot 添加 debug功能
- 补充spring事务传播性没有考虑的几种情况