leetcode 169. Majority Element

题意:数组长度为N,找出数组中元素出现个数大于N/2 的众数

法一:先排序,再来一次遍历硬数一下

class Solution
{
public:
    int majorityElement(vector<int>& nums)
    {
        if (nums.size() == 1) return nums[0];
        int ret = 1,val,tmp=1;
        sort(nums.begin(),nums.end());
        for (int i=1; i<nums.size(); i++)
        {
            if (nums[i] == nums[i-1])
            {
                tmp++;
                if (tmp > ret)
                {
                    ret = tmp;
                    val = nums[i];
                }
            }
            else
            {
                tmp = 1;
            }
        }
        return val;
    }
};

 法二:Moore Voting Algorithm算法,动画在这里:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html#step12  看了动画就能理解了

class Solution
{
public:
    int majorityElement(vector<int>& nums)
    {
        int elem = nums[0],ct = 1;
       for (int i=1; i<nums.size(); i++)
       {
           if (ct == 0)
           {
               elem = nums[i];
               ct = 1;
           }
           else  if (nums[i] == elem)
           {
               ct++;
           }
           else  if (nums[i] != elem)
           {
               ct--;
           }
       }
      return elem;
    }
};

  法三:随机数,

class Solution
{
public:
    int majorityElement(vector<int>& nums)
    {
       if (nums.size() == 1)return nums[0];
        
        while (1)
        {
            int pos = rand()%(nums.size() -1);
            int ct = 0;
            for (int i=0; i<nums.size(); i++)
            {
                if (nums[i] == nums[pos])ct++;
            }
            if (ct > nums.size()/2 )
                return nums[pos];
        }
    }
};

  

  

原文地址:https://www.cnblogs.com/sxy-798013203/p/7658906.html