lintcode-47-主元素 II
47-主元素 II
给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。
注意事项
数组中只有唯一的主元素
样例
给出数组[1,2,1,2,1,3,3] 返回 1
挑战
要求时间复杂度为O(n),空间复杂度为O(1)。
标签
LintCode 版权所有 枚举法 贪心 Zenefits
思路
参考资料
本题可以一般化为求出数组中出现次数大于数组长度1/k的主元素,本题k=3。若数组长度为n,主元素次数为x,即
x / n > 1 / k
两边同时-1,化简为
(x - 1) / (n - k) > 1/ k
可表示为:若主元素个数-1,同时数组个数-k时,主元素不会被改变。
于是,可得出如下步骤:
- 首先遍历数组,建立一个键为数组中元素,值为当前元素出现次数的hash表
- 当hash表的大小小于k时,继续步骤1;否则继续步骤3
- 对现在hash表中的所有键的值减1
- 从hash表中剔除值为0的键值对
- 持续进行以上步骤,直到所有数组元素全部被遍历完。
- 对现在得到的这个hash表的值归0,
- 遍历数组,统计现在hash表中的元素的个数,返回个数最多的那个元素,即主元素。
code
class Solution {
public:
/**
* @param nums: A list of integers
* @return: The majority number occurs more than 1/3.
*/
int majorityNumber(vector<int> nums) {
// write your code here
int size = nums.size(), hashMaxSize = 3, i = 0;
map<int, int> hashMap;
map<int, int>::iterator it;
int result = 0, maxCount = 0;
for(i=0; i<size; i++) {
if(hashMap.size() < hashMaxSize) {
it = hashMap.find(nums[i]);
if(it == hashMap.end()) {
hashMap.insert(pair<int, int>(nums[i], 1));
}
else {
(it->second)++;
}
}
else {
for(it=hashMap.begin(); it!=hashMap.end(); it++) {
(it->second)--;
}
for(it=hashMap.begin(); it!=hashMap.end();) {
if(it->second == 0) {
hashMap.erase(it++);
}
else {
it++;
}
}
}
}
for(it=hashMap.begin(); it!=hashMap.end(); it++) {
it->second = 0;
}
for(i=0; i<size; i++) {
it = hashMap.find(nums[i]);
if(it != hashMap.end()) {
it->second++;
if(maxCount < it->second) {
maxCount = it->second;
result = it->first;
}
}
}
return result;
}
};
lintcode-47-主元素 II的更多相关文章
- lintcode 中等题:Majority number II 主元素 II
题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...
- 主元素 II
主元素 II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时间复 ...
- lintcode.46 主元素
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 注意事项 You may assume that the array is non-empty and the ma ...
- LeetCode OJ:Majority Element II(主元素II)
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...
- LintCode之主元素
题目描述: 分析:由题目可知这个数组不为空且该主元素一定存在,我选用HashMap来存储,HashMap的存储结构是”键—值对“,”键“用来存储数组元素,”值“用来存储这个元素出现的次数,然后循环遍历 ...
- Lintcode 166. 主元素
----------------------------------- Moore's voting algorithm算法:从一个集合中找出出现次数半数以上的元素,每次从集合中去掉一对不同的数,当剩 ...
- lintcode 中等题:majority number III主元素III
题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...
- LintCode主元素
主元素1: 这道题是编程之美上的一道原题,如果题目未对时间复杂度有严格要求的话可以先排序,再取中位数. 本题中要求算法达到时间复杂度为O(n),空间复杂度为O(1),算法如下: public int ...
- 47 Majority Element II
原题网址; https://www.lintcode.com/problem/majority-element-ii/ 描述 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三 ...
随机推荐
- Lintcode算法
题目: 给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数. 样例 给出 [1, 20, 23, 4, 8],返回组合最大的整数应为8423201. 思路:直接交换两个数,然后判断交换之后的 ...
- LVS NAT,DR,TUN三种负载原理
负载均衡简单介绍 用通俗的话来说负载均衡,就是通过不同的调度机制将用户的请求分派到后端不同的服务器.缓解服务器的请求压力,实现负载均衡的方案有多种,下面简单说说了解的几种方式: DNS 负载:利用DN ...
- 避免 ‘sudo echo xxxx >’ 时候 出现 “permission denied”
➜ ~ echo "/opt/nfs 10.10.10.*(rw,all_squash,sync)">>/etc/exports zsh: permission de ...
- Django---admin简单功能
admin admin是django强大功能之一,它能共从数据库中读取数据,呈现在页面中,进行管理.默认情况下,它的功能已经非常强大,如果你不需要复杂的功能,它已经够用,但是有时候,一些特殊的功能还需 ...
- I/O流、序列化
1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Seri ...
- Python学习:for 循环 与 range()函数
for 循环 For … in 语句是另一种循环语句,其特点是会在一系列对象上进行迭代(Iterates),即它会遍历序列中的每一个项目 注意: 1.else 部分是可选的.当循环中包含它时,它 ...
- crest value &minimum
public class paixu { public static void main(String[] args) { double temp; double num[]={5.1, 7.12, ...
- JAVA判断时间是否在时间区间内
package com.liying.tiger.test; import java.text.ParseException; import java.text.SimpleDateFormat; i ...
- JDBC 的使用
使用 MariaDB,JDBC 所有操作全部使用预处理 SQL 的基本类型与 Java 类型的对应关系 CHAR(N) - String VARCHAR(N) - String BOOLEN - bo ...
- android中接入twitter进行第三方登录
在应用中接入Twitter进行第三方登录时,开发人员遇到了一点问题,主要是概念有点混乱,这里把经验记录一下,帮助遇到同样问题的朋友. 一.注册应用并配置登录权限 这一步比较简单,就不多说了,直接去官网 ...