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

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

然而,该算法(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. Javascript 获取dom的宽度 随笔一

    javascript 中 offsetWidth 获得的并不是 真实的宽度 不等于 style.width ;offetWidth 实际上获得的是物体的盒模型尺寸. 包括 border padding ...

  2. UGUI穿透3D世界判断&&UGUI全事件监听

    public bool isPointUI(){ PointerEventData eventDataCurrnt = new PointerEventData (EventSystem.curren ...

  3. 【HDOJ】4857 逃生

    很容易想到优先队列+拓扑排序.关键点是有限制条件者有限,无限制条件者在最后,条件相同者按序输出.因此采用逆序. #include <iostream> #include <queue ...

  4. 【HDOJ】2510 符号三角形

    暴力打表. #include <cstdio> ]={,,,,,,,,,,,,,,,,,,,,,,,,}; int main() { while (scanf("%d" ...

  5. Android之路-------传说中的大喇叭(广播接收器)

    前言 没想到离上一篇博文的时间已经有一个多星期了,时间真的不等人啊,在这里LP告诉你们一个道理,如果现在有谁正在看管理时间的书,那么请你们把这些书放下吧,看了也没有用,因为时间我们根本管不了,我们只能 ...

  6. linux chgrp命令【转载】

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  7. remastersys

  8. Linux 下最为人熟知的解压缩工具

    很多时候,通过互联网发送或接收大文件和图片是一件令人头疼的事.压缩及解压缩工具正好可以应对这个问题.下面让我们快速浏览一些可以使得我们的工作更加轻松的开源工具. Tar Tar 由 ‘Tape arc ...

  9. 递归实现生成Grey码

    腾讯2016研发笔试题1: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n, ...

  10. Media层

    媒体层包含图形技术.音频技术和视频技术,这些技术相互结合就可为移动设备带来最好的多媒体体验,更重要的是,它们让创建外观音效俱佳的应用程序变得更加容易.您可以使用iOS的高级框架更快速地创建高级的图形和 ...