LeetCode 229 求众数 II

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element-ii/

博主Github:https://github.com/GDUT-Rp/LeetCode

题目:

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

示例 1:

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

示例 2:

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

示例 3:

输入:[1,1,1,3,3,2,2,2]
输出:[1,2]

提示:

111 <= nums.length <= 5∗1045 * 10^45∗104
−109-10^9−109 <= nums[i] <= 10910^9109

解题思路:

方法一:map统计个数然后计算判断

直观想法

map统计各个数的分布情况,然后计算判断是否符合条件。

C++

class Solution {public:vector<int> majorityElement(vector<int>& nums) {int n = nums.size();vector<int> ans;unordered_map<int, int> cnt;for (auto & v : nums) {cnt[v]++;}for (auto & v : cnt) {if (v.second > n / 3) {ans.push_back(v.first);}}return ans;}
};

Golang

func majorityElement(nums []int) []int {numberCount := map[int]int{}for _, num := range nums {numberCount[num] ++}var numbers []intfor k, v := range numberCount {if v > len(nums) / 3 {numbers = append(numbers, k)}}return numbers
}

Python

class Solution:def majorityElement(self, nums: List[int]) -> List[int]:number_count = {}for num in nums:if num not in number_count:number_count[num] = 1else:number_count[num] += 1result = []for key, value in number_count.items():if value > len(nums) / 3:result.append(key)return result

复杂度分析

时间复杂度:O(n)O(n)O(n)
空间复杂度:O(n)O(n)O(n)

方法二:摩根投票法

笔者没有想到这个解法,这里参考自 龅牙叔。

有一个对摩尔投票法非常形象的比喻:多方混战。

首先要知道,在任何数组中,出现次数大于该数组长度1/3的值最多只有两个。

我们把这道题比作一场多方混战,战斗结果一定只有最多两个阵营幸存,其他阵营被歼灭。数组中的数字即代表某士兵所在的阵营。

我们维护两个潜在幸存阵营A和B。我们遍历数组,如果遇到了属于A或者属于B的士兵,则把士兵加入A或B队伍中,该队伍人数加一。继续遍历。

如果遇到了一个士兵既不属于A阵营,也不属于B阵营,这时有两种情况:

A阵营和B阵营都还有活着的士兵,那么进行一次厮杀,参与厮杀的三个士兵全部阵亡:A阵营的一个士兵阵亡,B阵营的一个士兵阵亡,这个不知道从哪个阵营来的士兵也阵亡。继续遍历。

A阵营或B阵营已经没有士兵了。这个阵营暂时从地球上消失了。那么把当前遍历到的新士兵算作新的潜在幸存阵营,这个新阵营只有他一个人。继续遍历。

大战结束,最后A和B阵营就是初始人数最多的阵营。判断一下A,B的人数是否超过所有人数的三分之一就行了。

C++

class Solution {public:vector<int> majorityElement(vector<int>& nums) {vector<int> ans;int element1 = 0;int element2 = 0;int vote1 = 0;int vote2 = 0;for (auto & num : nums) {if (vote1 > 0 && num == element1) { //如果该元素为第一个元素,则计数加1vote1++;} else if (vote2 > 0 && num == element2) { //如果该元素为第二个元素,则计数加1vote2++;} else if (vote1 == 0) { // 选择第一个元素element1 = num;vote1++;} else if (vote2 == 0) { // 选择第二个元素element2 = num;vote2++;} else { //如果三个元素均不相同,则相互抵消1次vote1--;vote2--;}}int cnt1 = 0;int cnt2 = 0;for (auto & num : nums) {if (vote1 > 0 && num == element1) {cnt1++;}if (vote2 > 0 && num == element2) {cnt2++;}}// 检测元素出现的次数是否满足要求if (vote1 > 0 && cnt1 > nums.size() / 3) {ans.push_back(element1);}if (vote2 > 0 && cnt2 > nums.size() / 3) {ans.push_back(element2);}return ans;}
};

Go

func majorityElement(nums []int) []int {var number1, number2 intvar vote_count1, vote_count2 intfor _, num := range nums {if vote_count1 > 0 && num == number1 {vote_count1++} else if vote_count2 > 0 && num == number2 {vote_count2++} else if vote_count1 == 0 {number1 = numvote_count1++} else if vote_count2 == 0 {number2 = numvote_count2++} else {vote_count1--vote_count2--}}var cnt1, cnt2 intfor _, num := range nums {if vote_count1 > 0 && num == number1 {cnt1 ++}if vote_count2 > 0 && num == number2 {cnt2 ++}}var ans []intif cnt1 > len(nums) / 3 {ans = append(ans, number1)}if cnt2 > len(nums) / 3 {ans = append(ans, number2)}return ans
}

Python

class Solution:def majorityElement(self, nums: List[int]) -> List[int]:ans = []element1, element2 = 0, 0vote1, vote2 = 0, 0for num in nums:# 如果该元素为第一个元素,则计数加1if vote1 > 0 and num == element1:vote1 += 1# 如果该元素为第二个元素,则计数加1elif vote2 > 0 and num == element2:vote2 += 1# 选择第一个元素elif vote1 == 0:element1 = numvote1 += 1# 选择第二个元素elif vote2 == 0:element2 = numvote2 += 1# 如果三个元素均不相同,则相互抵消1次else:vote1 -= 1vote2 -= 1cnt1, cnt2 = 0, 0for num in nums:if vote1 > 0 and num == element1:cnt1 += 1if vote2 > 0 and num == element2:cnt2 += 1        # 检测元素出现的次数是否满足要求if vote1 > 0 and cnt1 > len(nums) / 3:ans.append(element1)if vote2 > 0 and cnt2 > len(nums) / 3:ans.append(element2)return ans

时间复杂度:O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1),只需要常数个元素用来存储关键元素和统计次数即可。

LeetCode 229 求众数 II相关推荐

  1. java求众数_Java实现 LeetCode 229 求众数 II(二)

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

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

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

  3. [leetcode]229. 求众数 II

    解题思路:题目要求空间复杂度为O(1) 大于1/3的数不会超过2个,利用Boyer-Moore 投票算法找到数量最多的两个数,再检查下这俩个数的数量有没有超过1/3 class Solution {p ...

  4. 【快乐水题】229. 求众数 II

    原题: 力扣链接:229. 求众数 II 题目简述: 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 解题思路 1.通过哈希表来计算出现次数 2.if(k == (n ...

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

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

  6. 229. 求众数 II

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

  7. leetcode 229. Majority Element II | 229. 求众数 II(找出现次数超过n/k的元素)

    题目 https://leetcode.com/problems/majority-element-ii/ 题解 思路来源于左程云<程序员代码面试指南> 问题描述 原问题:给定一个整型数组 ...

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

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

  9. Leetcode:169. 求众数

    题目链接 求众数 题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: ...

  10. LeetCode 《169+229.求众数》

    题目169: 思路: ① 题目说非空.一定存在众数,这道题忽略题目中的 N/2 就按照众数的真正定义来计算 ② 首先统计给定的List中每个元素出现的次数,以k/v的方式存到字典中 ③ 然后遍历字典, ...

最新文章

  1. WebRTC的拥塞控制技术转
  2. linux下shell命令trap
  3. sublime python插件_sublime text 3 + python配置,完整搭建及常用插件安装
  4. Android开发之xml动画(补间动画)记录
  5. mysql innodb和myisam区别_MySQL?存储引擎简介
  6. php中ini set,php ini_set函数的用法
  7. YOLOv5中的CSP结构
  8. 微信公众号小白的进阶之路
  9. OpenCV-分水岭算法
  10. RS笔记:传统推荐模型之FFM (引入特征域的概念) [2015 Criteo]
  11. Java 已知三边求三角形求面积
  12. 团队作业—beta冲刺
  13. SparkStreaming读取Kafka数据源并写入Mysql数据库
  14. 编码(NRZ、NRZI、曼彻斯特、4B
  15. 英语语音篇 - 特殊发音记录
  16. 程序员要注重沟通能力的提升
  17. 0039c语言作业答案2020,中石油华东2020年秋季学期《程序设计(C语言)在线考试题目答案...
  18. dwz导出excel java_dwz怎么导出excel
  19. 小朋友们freeeim
  20. mac之把打开终端设置快捷键为Ctrl+Alt+T

热门文章

  1. 单模光纤和多模光纤的区别,以及作用
  2. php mp3播放列表,ubuntu的本地MP3音乐播放器mpd+mpc
  3. python运行黑色窗口怎么弄_selenium+python 去除启动的黑色cmd窗口方法
  4. oracle无法进入nomount状态,数据库进入nomount状态
  5. 深度学习之车牌识别(中国、越南)
  6. [COGS 2264]魔法传输
  7. 异步时间扭曲(Asynchronous Timewarp简称ATW)一种生成中间帧技术
  8. 游戏建模:模型场景制作过程分享
  9. python 发送短信验证码
  10. 小失误点,不积跬步无以至千里