Majority Element解决:Moore's Voting Algorithm

原创 2016年06月01日 10:47:50
【前言】最近再刷leetcode的时候,遇到了一道关于主要元素的题目,题目如下:
Given an array of size , 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.

然后发现了一个类似投票的算法:A Linear Time Majority Vote Algorithm点击打开链接

算法主要解决在元素序列中找到出现次数较多的元素。

算法思想:

每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。
不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。

【解决思路】定义一个记录次数的数组count,count如果为0,则把改变当前候选者元素candidate,并把count设为1;否则根据当前元素e与候选者元素candidate比较来决定增加或减去count,最后的候选者元素即为所求;

候选者元素candidate即出现的count(次数)最多的元素。

When we move the pointer forward over an element e:

  • If the counter is 0, we set the current candidate to e and we set the counter to 1.
  • If the counter is not 0, we increment or decrement the counter according to whethere is the current candidate.
When we are done, the current candidate is the majority element, if there isa majority.

该题目中需要定义一个count,对应candidate出现的次数,代码如下:

         public int majorityElement3(int[] nums) {  
               if(nums.length==0)  
                   return 0;  
               int count=0;  
               int candidate=0;  
               for(int i : nums){  
                   if(candidate ==i)  
                       count++;  
                   else if(count==0){  
                       candidate =i;  
                       count=1;  
                   }  
                   else  
                       count--;  
               }  
               count=0;  
               for(int i : nums){  
                   if(i==candidate)  
                       count++;  
               }  
               return count>nums.length/2?candidate :0;     
           }  

【问题2】

Given an integer array of size n, 
find all elements that appear more than n/3 times. The algorithm should run in linear time and in O(1) space.


该题目中需要定义一个count数组,分别对应两个candidate出现的次数(元素出现次数大于n/3,至多两个candidate),代码如下:


         /**
      * Given an integer array of size n, 
      * find all elements that appear more than n/3 times. The algorithm should run in linear time and in O(1) space.
      * @param nums
      * @return
      */
     public List<Integer> majorityElement2(int[] nums) {
           /*
           A Linear Time Majority Vote Algorithm
           每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。
           不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。
           top 2  Majority Element (more than n/3 times.)
            */
            List<Integer> list=new ArrayList<Integer>();
            if(nums==null)
                return list;
            int[] count=new int[2];
            int[] candidate=new int[2];
            candidate[0]=0;
            candidate[1]=1;
            for(int i : nums){
                if(candidate[0]==i){
                    count[0]++;
                }
                else if(candidate[1]==i){
                    count[1]++;
                }
                else if(count[0]==0){
                    candidate[0]=i;
                    count[0]=1;
                }
                else if(count[1]==0){
                    candidate[1]=i;
                    count[1]=1;
                }
                else{
                    count[0]--;
                    count[1]--;
                }
            }
            for(int j=0;j<2;j++){
                count[j]=0;
            }
            for(int k : nums){//验证count是否满足n/3
                if(k==candidate[0])
                     count[0]++;
                else if(k==candidate[1])
                    count[1]++;
            }
            for(int l=0;l<2;l++){
                if(count[l]>nums.length/3&&!list.contains(candidate[l]))
                     list.add(candidate[l]);
            }
            return list;
        }

总结:上述算法的时间复杂度为O(n),而由于并不需要真的删除数组元素,我们也并不需要额外的空间来保存原始数组,空间复杂度为O(1)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Moore's voting algorithm

最近在刷LeetCode的题的时候,发现一个特别巧妙的算法:Moore’s voting algorithm。 这个算法是解决这样一个问题:从一个数组中找出出现半数以上的元素。 Moore的主页上...

LeetCode[Array]: Majority Element

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

Linear-time Iceberg Query Algorithm

Linear-time Iceberg Query Algorithm 00 来自:ibread.net2013-06-30 阅读原文 一、从面试题开始 在进入到枯...
  • pi9nc
  • pi9nc
  • 2013-07-17 14:43
  • 2113

Moore's voting最大投票算法

最近在刷LeetCode的题的时候,发现一个特别巧妙的算法:Moore’s voting algorithm。 这个算法是解决这样一个问题:从一个数组中找出出现半数以上的元素。 Moore...

153. Find Minimum in Rotated Sorted Array\229. Majority Element II\Moore's voting algorithm

Find Minimum in Rotated Sorted Array 题目描述 代码实现153. Find Minimum in Rotated Sorted Array题目描述一个已经排好序的数...

leetcode-169 Majority Element(Moore's voting algorithm)

最近在刷LeetCode的题(169 Majority Element)的时候,发现一个特别巧妙的算法:Moore’s voting algorithm。 这个算法是解决这样一个问题:从一个数组中找...

Moore's voting algorithm

Moore’s voting algorithm的实例使用。

Moore's majority vote algorithm

求n个数中出现次数超过

Majority Element浅谈 (A linear time iceberg query algorithm)

Majority Element浅谈 (A linear time iceberg query algorithm)我们经常在面试中遇到这道题:   给定一个数组nums, 找出可能的众数(即出现次...
  • labud
  • labud
  • 2015-07-25 14:53
  • 532

LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)

原文给定一个长度为n的整型数组,找出所有出现超过 ⌊ n/3 ⌋ 次的元素。算法应该运行在线性时间上,且进用O(1)O(1)空间。提示:它可能有多少个主要元素?原文Given an integer a...
  • NoMasp
  • NoMasp
  • 2016-08-29 21:40
  • 1318
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)