leetcode_c++:Majority Element II (229)
来源:互联网 发布:约瑟夫问题c语言 编辑:程序博客网 时间:2024/05/29 18:39
题目
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.
算法
http://blog.csdn.net/xudli/article/details/46784149
这道题让我们求出现次数大于n/3的众数,而且限定了时间和空间复杂度,那么就不能排序,也不能使用哈希表,这么苛刻的限制条件只有一种方法能解了,那就是摩尔投票法 Moore Voting,这种方法在之前那道题Majority Element 求众数中也使用了。题目中给了一条很重要的提示,让我们先考虑可能会有多少个众数,经过举了很多例子分析得出,任意一个数组出现次数大于n/3的众数最多有两个,具体的证明我就不会了,我也不是数学专业的。那么有了这个信息,我们使用投票法的核心是找出两个候选众数进行投票,需要两遍遍历,第一遍历找出两个候选众数,第二遍遍历重新投票验证这两个候选众数是否为众数即可,选候选众数方法和前面那篇Majority Element 求众数一样,由于之前那题题目中限定了一定会有众数存在,故而省略了验证候选众数的步骤,这道题却没有这种限定,即满足要求的众数可能不存在,所以要有验证。代码如下:
class Solution {public: vector<int> majorityElement(vector<int>& nums) { vector<int> res; int m = 0, n = 0, cm = 0, cn = 0; for (auto &a : nums) { if (a == m) ++cm; else if (a ==n) ++cn; else if (cm == 0) m = a, cm = 1; else if (cn == 0) n = a, cn = 1; else --cm, --cn; } cm = cn = 0; for (auto &a : nums) { if (a == m) ++cm; else if (a == n) ++cn; } if (cm > nums.size() / 3) res.push_back(m); if (cn > nums.size() / 3) res.push_back(n); return res; }};
0 0
- leetcode_c++:Majority Element II (229)
- leetcode_c++:Majority Element(169)
- [leetcode-229]Majority Element II(c++)
- leetcode#229 Majority Element II
- Leetcode 229 Majority Element II
- leetcode 229: Majority Element II
- Majority Element II (leetcode 229)
- [leetcode 229]Majority Element II
- LeetCode(229)Majority Element II
- [LeetCode 229] Majority element II
- leetcode 229:Majority Element II
- Majority Element II leetcode 229
- LeetCode 229 Majority Element II
- LeetCode #229: Majority Element II
- LeetCode[229] Majority Element II
- leetcode-229- Majority Element II
- LeetCode 229 --- Majority Element II
- Majority Element && Majority Element II
- JavaWeb配置数据源连接数据库详解(概念详解+多种情况源代码范例+易出错类型)
- 人工智能作业homework3——模拟退火解决TSP
- 【软件工程】持续集成:如何建立百万行级代码的版本构建系统(三)系统优化
- Lock
- 阿里云服务器web应用安全-XSS攻击
- leetcode_c++:Majority Element II (229)
- Exynos4412 ADC 设备驱动开发
- C++learning
- java基础知识:java项目的命名规范
- Java集合框架的层次结构和使用规则梳理
- volatile关键字解析
- 探索《How Tomcat Works》 心得(五) 日志系统
- 148. Sort List 链表归并排序
- IT传奇人物