介绍一种算法,它可以在线性时间和常数空间内,在一个数组内找出出现次数超过一半的某个数字。

要解决这个问题并不难,可以使用排序或哈希,但是这两种算法都不能同时满足时间或空间的要求。

然而,该算法(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的更多相关文章

  1. Boyer-Moore Majority Vote Algorithm

    介绍算法之前, 我们来看一个场景, 假设您有一个未排序的列表.您想知道列表中是否存在一个数量占列表的总数一半以上的元素, 我们称这样一个列表元素为 Majority 元素.如果有这样一个元素, 求出它 ...

  2. Boyer and Moore Fast majority vote algorithm(快速选举算法)

    问题来来自于leetcode上的一道题目,https://leetcode.com/problems/majority-element/,大意是是找出一个数组中,出现次数超过一个半的数字,要求是O(n ...

  3. LeetCode 169. Majority Element - majority vote algorithm (Java)

    1. 题目描述Description Link: https://leetcode.com/problems/majority-element/description/ Given an array ...

  4. Moore majority vote algorithm(摩尔投票算法)

    Boyer-Moore majority vote algorithm(摩尔投票算法) 简介 Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O( ...

  5. 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 ...

  6. 算法复习_线性时间求解Majority Vote Algorithm问题

    题目来源于Leecode上的Majority Element问题 Majority Element:在一个序列中出现了至少n/2的下界次 使用排序算法取中位数则需要Nlogn http://www.c ...

  7. [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 ...

  8. leetcode 229 Majority Element II

    这题用到的基本算法是Boyer–Moore majority vote algorithm wiki里有示例代码 1 import java.util.*; 2 public class Majori ...

  9. leetcode 169 Majority Element 冰山查询

    Given an array of size n, find the majority element. The majority element is the element that appear ...

随机推荐

  1. Android Service之LOCATION_SERVICE

    Android提供了GPS功能 LocationManager obj = (LocationManager)getSystemService(Context.LOCATION_SERVICE) Pe ...

  2. ajax vs oauth

    http://www.cnblogs.com/rush/archive/2012/05/15/2502264.html https://www.ibm.com/developerworks/cn/xm ...

  3. LINUX BASH SHELL,小小学习一下

    注意点要注意的: 整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1` ...

  4. 【HDOJ】4884 TIANKENG's rice shop

    简单模拟,注意并不是完全按照FIFO的顺序.比如第i个人的id为k,那么就算第i+1人的id不为k,也会检查他后续的排队人是否有id为k的. #include <cstdio> #incl ...

  5. Xen、KVM和VirtualBox比拼

    vbox 与 kvm 的区别: vbox 是由 qemu 改写而成,包含大量 qemu 代码.可以使用于 不支持 虚拟化的cpu.值得说的一点:vbox 在图形方面比较好,能进行2D 3D加速.cpu ...

  6. POJ_3356——最短编辑距离,动态规划

    Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...

  7. 简单的jQuery日期选择

    建立一个存放日期的文本框 点击文本框弹出一个选择框引用jQuery文件引用bootstrap文件 使用模态框 使用模态框的方法设置点击文本框显示模态框手动打开模态框的方法:$('id').modal( ...

  8. ASP.NET MVC 3 Model【通过一简单实例一步一步的介绍】

    今天主要讲Model的两个方面: 1. ASP.Net MVC 3 Model 简介 通过一简单的事例一步一步的介绍 2. ASP.Net MVC 3 Model 的一些验证 MVC 中 Model ...

  9. iOS UITextField 设置内边距

    [self.yourTextField setValue:[NSNumber numberWithInt:5] forKey:@"_paddingTop"]; [self.your ...

  10. 跟着Android学设计模式:代理(proxy)

    代理模式 1.意图:为其它对象提供一种代理以控制对这个对象的訪问. 2.适用性: 远程代理:虚代理.保护代理:智能引用: Android源代码中用到了大量的代理设计模式.比方Context的设计,Bi ...