线性时间常数空间找到数组中数目超过n/5的所有元素
问题描述:
Design an algorithm that, given a list of n elements in an array, finds all the elements that appear more than n/3 times in the list. The algorithm should run in linear time ( n >=0 )
You are expected to use comparisons and achieve linear time. No hashing/excessive space/ and don't use standard linear time deterministic selection algo
解答:
借鉴俄罗斯方块的玩法,先给个直观的例子。对于数组 4 3 3 2 1 2 3 4 4 7,按照类俄罗斯方块的玩法,当7要往下落的时候,屏幕上会呈现这个场景
4
4 3 2
4 3 2 1 _
当7落下时,获得了
4
4 3 2
4 3 2 1 7
此时最后一行元素数目满了(最后一行的大小为5),将其删除,继续落数字。直到所有数字都落下来了。此时数目超过n/5的元素一定在最后一行(因为假设数字a的个数超过n/5,删除操作最多执行了n/5次,所以最后必然a还在最后一行中)。但是,最后一行中的元素也有可能不是我们要的。此时需要扫描一下来确定。
同样的算法对于任意的m(m为正整数)均适用。
给出代码:
1: #include <iostream>
2: #include <map>
3: #include <algorithm>
4: typedef std::map<int, int> Map;
5: Map findOverNth(int arr[], int size, int n)
6: {
7: Map ret_map;
8: typedef Map::value_type Elem; //pair<CONST int, int>
9: int total = 0;
10: std::for_each(arr, arr + size, [&, n](int val)
11: {
12: auto ret_pair = ret_map.insert(Elem(val, 0));
13: ++(*ret_pair.first).second; ++ total;
14: if (ret_map.size() == n)
15: for (auto iter = ret_map.begin(); iter != ret_map.end(); )
16: {
17: --(*iter).second; -- total;
18: if ((*iter).second == 0)
19: ret_map.erase(iter++);
20: else
21: iter++;
22: }
23: });
24: std::for_each(ret_map.begin(), ret_map.end(), [](Elem &elem) {elem.second = 0;});
25: std::for_each(arr, arr + size, [&ret_map](int val) {if (ret_map.find(val) != ret_map.end()) ret_map[val] ++;});
26: for (auto iter = ret_map.begin(); iter != ret_map.end(); )
27: {
28: if ((*iter).second <= size / n)
29: ret_map.erase(iter++);
30: else
31: iter++;
32: }
33: return ret_map;
34: }
35: using namespace std;
36: int main()
37: {
38: //int arr[] = {5,6,7,8, 10, 4,4, 4, 4,1, 1,1};
39: int arr[] = {5,6,7,8, 10, 10, 10,10,10,10, 4,4, 4, 4,4,1, 1,1,1};
40: auto a_map = findOverNth(arr, sizeof(arr)/sizeof(int), 4);
41: cout<<sizeof(arr)/sizeof(int)<<endl;
42: //cout<<a_map.size()<<endl;
43: for each(auto elem in a_map)
44: {
45: cout<<elem.first<<" "<<elem.second<<endl;
46: }
47: }
线性时间常数空间找到数组中数目超过n/5的所有元素的更多相关文章
- 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?
如何使用异或(XOR)运算找到数组中缺失的数? 今天给大家分享一篇关于使用XOR(异或)运算找到数组中缺失的数的问题. 在一次Javascript面试中,有这么一个问题: 假设有一个由0到99(包含9 ...
- php array_rand()函数从数组中随机选择一个或多个元素
php使用array_rand()函数从数组中随机选择一个或多个元素的方法. 使用array_rand() 函数从数组中随机选出一个或多个元素,并返回. array_rand(array,numbe ...
- Java 找到数组中两个元素相加等于指定数的所有组合
思路1:可以用hash表来存储数组中的元素,这样我们取得一个数后,去判断sum - val 在不在数组中,如果在数组中,则找到了一对二元组,它们的和为sum,该算法的缺点就是需要用到一个hash表,增 ...
- leetcode-1 Two Sum 找到数组中两数字和为指定和
问题描写叙述:在一个数组(无序)中高速找出两个数字,使得两个数字之和等于一个给定的值.如果数组中肯定存在至少一组满足要求. <剑指Offer>P214(有序数组) <编程之美& ...
- [LeetCode] 448. Find All Numbers Disappeared in an Array 找到数组中消失的数字
题目描述 给定n个数字的数组,里面的值都是1-n,但是有的出现了两遍,因此有的没有出现,求没有出现值这个数组中的值有哪些. 要求不能用额外的空间(除了返回列表之外),时间复杂度n 思路 因为不能用额外 ...
- 《剑指offer》-找到数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- majority element(数组中找出出现次数最多的元素)
Given an array of size n, find the majority element. The majority element is the element that appear ...
- 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 【原创】leetCodeOj --- Majority Element 解题报告(脍炙人口的找n个元素数组中最少重复n/2次的元素)
题目地址: https://oj.leetcode.com/problems/majority-element/ 题目内容: Given an array of size n, find the ma ...
随机推荐
- C#模糊查询绑定datagridview
private CollectionViewSource wgdData = new CollectionViewSource(); private DataTable Ds_wgd { get { ...
- ORACLE-RAC-11G-R2_INSTALL
ORACLE 11.2.0.3 RAC INSTALL 20 ...
- iOS开发之构建Widget
原文出处: 陈凯 在 jianshu 的博客(@chenkaiHome) 欢迎分享原创到伯乐头条 伴随这iOS 8 系统多达4000项API更新而来同样还有Today Extension.而对iO ...
- Java程序员面试中的多线程问题
很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的.这篇文章收集了Java线程方面 ...
- SpringMVC处理脚本,SQL注入问题
SpringMVC处理脚本,SQL注入问题(写的不好勿喷,互相学习) 使用 Filter 来过滤浏览器发出的请求,对每个URI参数请求过滤些关键字,替换成安全的字符.所有请求的 getParamete ...
- 不会JS中的OOP,你也太菜了吧!(第二篇)
一.你必须知道的 1> 原型及原型链在继承中起到了关键的作用.所以你一定要理解他们.2> 不会JS中的OOP,你也太菜了吧!(第一篇) 二.继承的6种方法 1> 原型链继承 原型链继 ...
- Careercup - Google面试题 - 5692127791022080
2014-05-08 22:09 题目链接 原题: Implement a class to create timer object in OOP 题目:用OOP思想设计一个计时器类. 解法:我根据自 ...
- SQL Server 中使用 convert 转换 datetime 格式示例
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar(100), GETDATE() ...
- Netsharp快速入门(之9) 基础档案(工作区3 添加商品菜单,以及在产品中打开商品界面)
作者:秋时 杨昶 时间:2014-02-15 转载须说明出处 3.5.2 添加导航菜单 1.打开平台工具,插件和资源节点,选择创建导航菜单,打开创建向导 2.选择所属插件 3.选择在哪个分类下 ...
- Oracle VM VirtualBox 5.0 CentOS 6.4 共享文件夹
首先在主机(win7)的硬盘建立需要共享文件夹 例如 D:\share_test 然后虚拟机光驱加载Oracle VM VirtualBox安装目录的iso C:\Program Files\Ora ...