A Linear Time Majority Vote Algorithm
介绍一种算法,它可以在线性时间和常数空间内,在一个数组内找出出现次数超过一半的某个数字。
要解决这个问题并不难,可以使用排序或哈希,但是这两种算法都不能同时满足时间或空间的要求。
然而,该算法(A Linear Time Majority Vote Algorithm )却可以在同时满足这两个条件的情况下完美地解决问题。
现在将该算法简单描述如下:
对于数组中出现的某个数字设为待定数字,如果它出现则将其出现次数加一,如果没有出现则减一,如果减至零则将当前数字更换为新的待定数字。这样线性遍历之后可以剩下的待定数字,再用一遍遍历验证它是否满足条件。
举例:
{1,2,2,2,3}最后得到2,经验证满足条件
{1,2,3,4}最后得到4,经验证不满足条件
class Solution {
public:
int majorityElement(vector<int>& nums) {
,m=;
;i<nums.size();++i)
{
if(nums[i]==a) ++m;
) a=nums[i],m=;
else --m;
}
return a;
}
};
这个算法并不太容易理解。
我通俗的解释一下,假设某个位置的数字都代表它要投的一个候选人,如果该位置的投的候选人与当前的候选人不同则意味着对当前候选人投反对票。由于最终满足条件的候选人次数大于n/2,所以其余所有人的反对票也不及它的票数,所以这样做可以得到正确结果。当然如果候选人次数小于等于n/2,就有可能被反对掉。
这个问题可以进行拓展。
如何在线性时间和常数空间内,找到出现次数超过数组大小的三分之一的两个数字。
我们同样可以使用这个算法解决,由于该两个数的出现次数超过三分之一,余下的部分不足以将它们反对掉。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
,b=,n=,m=;
;i<nums.size();++i)
{
if(nums[i]==a) ++m;
else if(nums[i]==b) ++n;
) a=nums[i],m=;
) b=nums[i],n=;
else --n,--m;
}
m=n=;
;i<nums.size();++i)
{
if(nums[i]==a) ++m;
else if(nums[i]==b) ++n;
}
vector<int> result;
) result.push_back(a);
) result.push_back(b);
return result;
}
};
再进一步扩展,只要是在n个数字中寻找出现次数超过n/(m+1)的m个数字都可以这样解决。
参考 http://blog.csdn.net/chfe007/article/details/42919017
A Linear Time Majority Vote Algorithm的更多相关文章
- Boyer-Moore Majority Vote Algorithm
介绍算法之前, 我们来看一个场景, 假设您有一个未排序的列表.您想知道列表中是否存在一个数量占列表的总数一半以上的元素, 我们称这样一个列表元素为 Majority 元素.如果有这样一个元素, 求出它 ...
- Boyer and Moore Fast majority vote algorithm(快速选举算法)
问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n ...
- LeetCode 169. Majority Element - majority vote algorithm (Java)
1. 题目描述Description Link: https://leetcode.com/problems/majority-element/description/ Given an array ...
- Moore majority vote algorithm(摩尔投票算法)
Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...
- leetcode 169. Majority Element 多数投票算法(Boyer-Moore Majority Vote algorithm)
题目: Given an array of size n, find the majority element. The majority element is the element that ap ...
- 算法复习_线性时间求解Majority Vote Algorithm问题
题目来源于Leecode上的Majority Element问题 Majority Element:在一个序列中出现了至少n/2的下界次 使用排序算法取中位数则需要Nlogn http://www.c ...
- [LeetCode] 229. Majority Element II 多数元素 II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...
- leetcode 229 Majority Element II
这题用到的基本算法是Boyer–Moore majority vote algorithm wiki里有示例代码 1 import java.util.*; 2 public class Majori ...
- leetcode 169 Majority Element 冰山查询
Given an array of size n, find the majority element. The majority element is the element that appear ...
随机推荐
- yo angualr-fullstatck 项目打包部署
yoeman使用grunt进行打包部署,直接运行grunt命令即可,期间会对代码进行检查,如果存在不规范的地方jshint会指定出来. grunt会对静态资源进行打包而且对资源文件名进行了MD5作为版 ...
- 理解ThreadLocal(转)
小结 ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题.在很多情况下,ThreadLocal比直接使用synchronized ...
- pstree命令
功能说明:以树状图显示运行的程序. 语法:pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>] 补充说明:pstree指 ...
- bzoj3890 [Usaco2015 Jan]Meeting Time
Description Bessie and her sister Elsie want to travel from the barn to their favorite field, such t ...
- 2014-08-29 Last Day
今天实在吾索实习的第38天,也是这个暑假在吾索实习的最后一天. 这天里,并有做过多的新知识的学习,而是对先前的BBS系统进行优化,从外观的优化到每一行每一句代码的优化,希望能系统有更高的效率.虽说,暑 ...
- iOS开发之自定义输入框(利用UITextField及UITextView)
drawRect的工作原理:首先苹果是不推荐我们直接使用drawRect进行工作的,直接调用他也是没有任何效果的.苹果要求我们调用UIView类中的setNeedsDisplay方法,则程序会自动调用 ...
- Git详解之一 Git起步
起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ...
- 推荐一款不错的dialog小工具:artDialog
推荐一款不错的dialog小工具, 地址:http://www.planeart.cn/demo/artDialog/_doc/labs.html 相关介绍例如以下: artDialog是一个基于ja ...
- [Reduc] React Counter Example
Before you use the React Redux bindings, learn how to create a complete simple application with just ...
- 错误处理:java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag
在使用JSP.Servlet进行开发时,遇到java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEac ...