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) {
        int a=0,m=0;
        for(int i=0;i<nums.size();++i)
        {
            if(nums[i]==a) ++m;
            else if(m==0) a=nums[i],m=1;
            else --m;
        }
        return a;
    }
};

这个算法并不太容易理解。

我通俗的解释一下,假设某个位置的数字都代表它要投的一个候选人,如果该位置的投的候选人与当前的候选人不同则意味着对当前候选人投反对票。由于最终满足条件的候选人次数大于n/2,所以其余所有人的反对票也不及它的票数,所以这样做可以得到正确结果。当然如果候选人次数小于等于n/2,就有可能被反对掉。

这个问题可以进行拓展。

如何在线性时间和常数空间内,找到出现次数超过数组大小的三分之一的两个数字。

我们同样可以使用这个算法解决,由于该两个数的出现次数超过三分之一,余下的部分不足以将它们反对掉。

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int a=0,b=0,n=0,m=0;
        for(int i=0;i<nums.size();++i)
        {
            if(nums[i]==a) ++m;
            else if(nums[i]==b) ++n;
            else if(m==0) a=nums[i],m=1;
            else if(n==0) b=nums[i],n=1;
            else --n,--m;
        }
        m=n=0;
        for(int i=0;i<nums.size();++i)
        {
            if(nums[i]==a) ++m;
            else if(nums[i]==b) ++n;
        }
        vector<int> result;
        if(m>nums.size()/3) result.push_back(a);
        if(n>nums.size()/3) result.push_back(b);
        return result;
    }
};

参考 http://blog.csdn.net/chfe007/article/details/42919017

时间: 2024-10-11 03:23:37

A Linear Time Majority Vote Algorithm的相关文章

多数投票算法(Majority Vote Algorithm)

在面试题中经常会出现这样一个题目,给一个数组,其中含有N个非负元素,让你求出数组中出现次数超过一半的数字. 看到这个问题我们首先想到的可能是暴力的解法,那就是将数组排个序,输出中间的元素就行了,因为如果出现次数超过一半的话排完序后中间的那个元素肯定是我们需要求的值. 这样做的话排序的时间复杂度一般来说是O(NlogN),那么有没有时间复杂度为n的算法呢? 答案当然是有的,有这样的一个算法,Majority Vote Algorithm,他是这样的做的:设置一个计数器count和保存最多元素的变量

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 appears more than ⌊ n/2 ⌋ times. You may assume that the array is non-empty and the majority element always exist in the array. 题解:运用多数投票算法的思路来解:从头到尾遍历数

Task 待学习内容【Moore majority vote algorithm(摩尔投票算法)】

https://www.cnblogs.com/zhonghuasong/p/6536665.html 参见:https://my.oschina.net/u/2277632/blog/2873164 原文地址:https://www.cnblogs.com/leodaxin/p/11355590.html

[ISSUE] Majority Vote

源引自己的github.io http://awarrior.github.io/majority-vote/ Describe Give you a log of searching that contains N words, how to find out one key word which appears over N/2 times (definitely exists), just using O(n) time complexity? Analyze There is a ver

TODO list

A Linear Time Majority Vote Algorithm http://www.cs.utexas.edu/~moore/best-ideas/mjrty/index.html Find Duplicate in O(n) by Knuth http://keithschwarz.com/interesting/code/?dir=find-duplicate

[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 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] 169. Maj

leetcode 229. Majority Element II(多数投票算法)

就是简单的应用多数投票算法(Boyer–Moore majority vote algorithm),参见这道题的题解. class Solution { public: vector<int> majorityElement(vector<int>& nums) { int cnt1=0,cnt2=0,ans1=0,ans2=1; for(auto n:nums){ if(n==ans1){ cnt1++; } else if(n==ans2){ cnt2++; } el

Lintcode: Majority Number 解题报告

Majority Number 原题链接:http://lintcode.com/en/problem/majority-number/# Given an array of integers, the majority number is the number that occurs more than half of the size of the array. Find it. Example For [1, 1, 1, 1, 2, 2, 2], return 1 Challenge O(

leetcode 169 Majority Element 冰山查询

Given an array of size n, find the majority element. The majority element is the element that appears more than ? n/2 ? times. You may assume that the array is non-empty and the majority element always exist in the array. 思路: Find k different element