[LeetCode] Majority Element II 求大多数之二
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3]
Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
这道题让我们求出现次数大于 n/3 的数字,而且限定了时间和空间复杂度,那么就不能排序,也不能使用 HashMap,这么苛刻的限制条件只有一种方法能解了,那就是摩尔投票法 Moore Voting,这种方法在之前那道题 Majority Element 中也使用了。题目中给了一条很重要的提示,让先考虑可能会有多少个这样的数字,经过举了很多例子分析得出,任意一个数组出现次数大于 n/3 的数最多有两个,具体的证明博主就不会了,博主也不是数学专业的(热心网友用手走路提供了证明:如果有超过两个,也就是至少三个数字满足“出现的次数大于 n/3”,那么就意味着数组里总共有超过 3*(n/3) = n 个数字,这与已知的数组大小矛盾,所以,只可能有两个或者更少)。那么有了这个信息,使用投票法的核心是找出两个候选数进行投票,需要两遍遍历,第一遍历找出两个候选数,第二遍遍历重新投票验证这两个候选数是否为符合题意的数即可,选候选数方法和前面那篇 Majority Element 一样,由于之前那题题目中限定了一定会有大多数存在,故而省略了验证候选众数的步骤,这道题却没有这种限定,即满足要求的大多数可能不存在,所以要有验证,参加代码如下:
class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        vector<int> res;
        int a = , b = , cnt1 = , cnt2 = , n = nums.size();
        for (int num : nums) {
            if (num == a) ++cnt1;
            else if (num == b) ++cnt2;
            else if (cnt1 == ) { a = num; cnt1 = ; }
            else if (cnt2 == ) { b = num; cnt2 = ; }
            else { --cnt1; --cnt2; }
        }
        cnt1 = cnt2 = ;
        for (int num : nums) {
            if (num == a) ++cnt1;
            else if (num == b) ++cnt2;
        }
        if (cnt1 > n / ) res.push_back(a);
        if (cnt2 > n / ) res.push_back(b);
        return res;
    }
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/229
类似题目:
Check If a Number Is Majority Element in a Sorted Array
参考资料:
https://leetcode.com/problems/majority-element-ii/
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Majority Element II 求大多数之二的更多相关文章
- [LeetCode] Majority Element II 求众数之二
		
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
 - Leetcode: Majority Element II
		
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
 - LeetCode 229. Majority Element II (众数之二)
		
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
 - 229. Majority Element II求众数II
		
网址:https://leetcode.com/problems/majority-element-ii/ 参考:https://blog.csdn.net/u014248127/article/de ...
 - 229 Majority Element II 求众数 II
		
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素. 你的算法应该在O(1)空间中以线性时间运行. 详见:https://leetcode.com/problems/major ...
 - leetcode 169. Majority Element 、229. Majority Element II
		
169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...
 - [LeetCode] Majority Element  求众数
		
Given an array of size n, find the majority element. The majority element is the element that appear ...
 - [LeetCode] Majority Element 求大多数
		
Given an array of size n, find the majority element. The majority element is the element that appear ...
 - LeetCode Majority Element I && II
		
原题链接在这里:Majority Element I,Majority Element II 对于Majority Element I 来说,有多重解法. Method 1:最容易想到的就是用Hash ...
 
随机推荐
- Java知识回顾 (7) 继承、多态与接口、封装
			
一.继承 1.1 继承的特性 子类拥有父类非 private 的属性.方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以用自己的方式实现父类的方法. Java 的继承是单继承, ...
 - 咏南WEB APP开发框架
			
咏南WEB APP开发框架 咏南WEB桌面框架演示:47.106.93.126:9999 咏南WEB手机框架本地:47.106.93.126:8077 咏南CS框架下载:https://pan.bai ...
 - 中国大学MOOC-陈越、何钦铭-数据结构-2017春
			
中国大学MOOC-陈越.何钦铭-数据结构-2017春 学习地址 详细学习内容 Github记录地址 欢迎fork和star,有惊喜值得学习! 参考学习笔记 参考AC代码 数据结构和算法学习笔记 学习内 ...
 - MySQL中的isnull、ifnull和nullif函数用法
			
isnull(expr) 如expr为null,那么isnull()的返回值为1,否则返回值为0. mysql>select isnull(1+1); ->0 mysql>selec ...
 - settings设置中文admin
			
所以更改setttings.py 下 LANGUAGE_CODE = 'zh-Hans'即可
 - Docker 的插件式设计
			
http://www.tuicool.com/articles/MnIRZvJ http://uzhima.com/2016/08/02/what-is-docker-volume-plugin/ 在 ...
 - 【mysql】GitHub 的 MySQL 高可用性实践分享
			
原文出处: shlomi-noach 译文出处:oschina GitHub 使用 MySQL 作为所有非 git 仓库数据的主要存储, 它的可用性对 GitHub 的访问操作至关重要.Gi ...
 - lua变量作用域
			
3.5 – Visibility Rules Lua is a lexically scoped language. The scope of a local variable begins at t ...
 - Renascence架构介绍——文件夹
			
这一系列文章是为个人项目作一个介绍.有兴趣的朋友能够关注一下. https://github.com/jxt1234/Renascence 先写个文件夹.以后按文件夹更新 1.自己主动编程体系设想 2 ...
 - jquery.cookie.js写入的值没有定义
			
这个是插件的基本语法,你写的没错,错就错在你肯定是在本地测试的,cookie是基于域名来储存的.意思您要放到测试服务器上或者本地localhost服务器上才会生效.cookie具有不同域名下储存不可共 ...