zoukankan      html  css  js  c++  java
  • 【leetcode】Majority Element

    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.

    方法1,采用一个map,存储每一个变量的数量,最后得出个数大于n/2的元素
     1 class Solution {
     2 public:
     3     int majorityElement(vector<int> &num) {
     4        
     5         int n=num.size();
     6         int result;          
     7         map<int,int> num2count;
     8  
     9         for(int i=0;i<n;i++)
    10         {
    11             if(num2count.find(num[i])!=num2count.end())
    12             {
    13                 num2count[num[i]]++;
    14             }
    15             else
    16             {
    17                 num2count[num[i]]=1;
    18             }
    19         }
    20        
    21         map<int,int>::iterator it=num2count.begin();
    22         while(it!=num2count.end())
    23         {
    24             if(it->second>n/2)
    25             {
    26                 result=it->first;
    27                 break;                 
    28             }              
    29             it++;
    30         }
    31         return result;
    32     }
    33 };
     
     
    方法2,先排序,然后统计
     
     1 class Solution {
     2 public:
     3     int majorityElement(vector<int> &num) {
     4        
     5         sort(num.begin(),num.end());
     6         int result=num[0];
     7         int count=0;
     8         int max_count=1;
     9         int cur=num[0];
    10        
    11         for(int i=0;i<num.size();i++)
    12         {
    13             if(num[i]==cur) 
    14             {
    15                 count++;
    16             }
    17             else
    18             {
    19  
    20                 if(count>max_count)
    21                 {
    22                     result=cur;
    23                     max_count=count;
    24                 }
    25                 cur=num[i];
    26                 count=1;
    27             }
    28         }
    29        
    30         if(count>max_count)
    31         {
    32             result=cur;
    33         }
    34        
    35         return result;
    36  
    37     }
    38 };
     
    方法3,采用随机选取元素的方法,进行统计:
     1 #define random(x) (rand()%x)
     2 class Solution {
     3 public:
     4     int majorityElement(vector<int> &num) {
     5        
     6         int result;
     7         while(1)
     8         {
     9             result=num[random(num.size())];
    10             int count=0;
    11             for(int i=0;i<num.size();i++)
    12             {
    13                 if(num[i]==result)
    14                 {
    15                     count++;
    16                 }
    17             }
    18             if(count>num.size()/2)
    19             {
    20                 break;
    21             }
    22         }
    23         return result;
    24     }
    25 };
     
    多数投票算法:
    过程:
    Runtime: O( n ) — Moore voting algorithm: We maintain a current candidate and a counter initialized to 0. As we iterate the array, we look at the current element x: 
    1. If the counter is 0, we set the current candidate to x and the counter to 1.
    2. If the counter is not 0, we increment or decrement the counter based on whether x is the current candidate.
    After one pass, the current candidate is the majority element. Runtime complexity = O( n ).
     
     
     1 class Solution {
     2 public:
     3     int majorityElement(vector<int> &num) {      
     4        
     5         int count=0;
     6         int i=0;
     7         int result;
     8         while(i<num.size())
     9         {
    10             if(count==0)
    11             {
    12                 result=num[i];
    13                 count++;
    14             }
    15             else
    16             {
    17                 if(result==num[i])
    18                 {
    19                     count++;
    20                 }
    21                 else
    22                 {
    23                     count--;
    24                 }
    25             }
    26             i++;
    27         }       
    28         return result;       
    29     }
    30 };
  • 相关阅读:
    发布一个用于WinCE的矢量图控件
    [非原创]树和图的遍历
    对ZOJ第1146题的解答:LCDisplay
    [c#]可在任意位置弹出的BalloonTip
    windows程序开发中c++和c#的对照
    关于编译时的warning treated as error
    flyweight模式和图元几何变换
    i++和++i作为参数时的编译器处理方式分析~
    用小数数组计算E值(对ZOJ第1113题的解答)
    显示SendMessage和PostMessage的区别
  • 原文地址:https://www.cnblogs.com/reachteam/p/4183168.html
Copyright © 2011-2022 走看看