题目链接

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 数组长度次之后所有数都被删光了,但是这个数还剩下一点。

所以我们用两个变量 cand1cand2 表示两个候选人,cnt1cnt2 表示两个候选人数量。那么如果两个候选人有一个和当前数 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的那个数相关推荐

  1. 如何判断数组所有数都不等于一个数_工程师编程,C语言学习,关于数组方面的一些总结...

    在学习编程语言时,无论如何我们都逃不掉关于数组这个问题. 那么,在谈及这个问题时,我会从三个方面来思考: 1.数组的定义是什么,也就是何为数组? 2.如何在数组中填充元素(数据)? 3.如何用数组来解 ...

  2. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  3. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  4. 如何表示数组所有数都不等于一个数_力扣刷题那些事儿(3)-缺失的第一个正整数(41)...

    问题描述 官网题目地址: 力扣​leetcode-cn.com 问题分析 典型的 "看起来很简单" 的题目,但再仔细看发现要求时间复杂度和空间复杂度要求就知道自己错了. 简单描述就 ...

  5. LeetCode简单题之有序数组中出现次数超过25%的元素

    题目 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7,10 ...

  6. LeetCode 1287. 有序数组中出现次数超过25%的元素

    1. 题目 给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%. 请你找到并返回这个整数 示例: 输入:arr = [1,2,2,6,6,6,6,7 ...

  7. 最大连续子数组和 动态规划_每日LeetCode,乘积最大子数组

    152. 乘积最大子数组​leetcode-cn.com 给你一个整数数组nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积. 示例 1: 输入: ...

  8. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  9. 寻找数组中出现次数超过一半的数字

    [题 目]数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字.[思 路1]由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我 ...

最新文章

  1. BIZTALK项目中WEB引用WEBSERVICES服务时候报错
  2. php expat+DOM+SimpleXML XML读取
  3. IDEA在当前类中查找方法快捷键--转
  4. KindEditor js 路径修改及表单提交注意事项
  5. 2017.9.25 随机数生成器 失败总结
  6. [AaronYang]C#人爱学不学[1]
  7. cadence入门学习
  8. 华为交换机导入配置_华为交换机配置导入和导出
  9. 一位码农的人生自述(四十九)------大二学年自我总结
  10. 孙德顺敛财10亿,看图挖掘计算如何穿透与识别多层嵌套影子公司!
  11. netty编解码之jboss marshalling
  12. 给未来写封信app服务器维护中,‎App Store 上的“给未来写封信”
  13. matlab xfoil计算风力,低风速长叶片风力机翼型气动分析及优化研究
  14. Docker - 编译安装nginx镜像
  15. 双重否定表肯定,所以死鬼是活人吗?
  16. 测试cpu新旧软件,Revit2021 VS Revit2020新旧版本软件性能评测
  17. openfoam 源代码解析
  18. 【程序】STM32H743ZI用SDMMC2驱动88W8801 WiFi模块
  19. 服务器开远程桌面 开端口,Windows服务器远程桌面端口号如何修改
  20. Shakti是什么?

热门文章

  1. RabbitMQ的Work模式
  2. mfc 找到字符串中字符_利用滑动窗口解LeetCode438题:找到字符串中所有字母异位词...
  3. fvdm 跟驰模型 matlab仿真_【新书推荐】【2009.01】控制系统MATLAB计算及仿真(第3版)(黄忠霖)...
  4. Keras保存和载入训练好的模型和参数
  5. Failed to invoke the method subscribe in the service com.alibaba.dubbo.registry.RegistryService
  6. Java二叉树的构建与遍历
  7. 【JavaSE03】Java中分支语句-练习
  8. MongoDB从立地到成佛(介绍、安装、增删改查)
  9. 为 springboot 添加 debug功能
  10. 补充spring事务传播性没有考虑的几种情况