LeetCode | 169. 多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

Code:sort、hash、BM投票、随机数、位运算

class Solution {
public:
    // 先排序  直接返回 N/2位置的元素 (无论N是奇数还是偶数)
    int majorityElement(vector<int>& nums) {
        
        sort(nums.begin(), nums.end());
        return nums.at(nums.size() / 2);

    }

    // hash表 统计次数,再遍历获取大于N/2次数的num
    int majorityElement(vector<int>& nums) {
    
        unordered_map<int, int> m;

        for (int i = 0; i < nums.size(); ++i)
        {
            ++m[nums.at(i)];
            if (m[nums.at(i)] > nums.size() / 2)  //题意:必存在大于N / 2次数的数
                return nums.at(i);
        }
        return 0; //只是为了编译通过
    }

    //Boyer-Moore 投票算法
    int majorityElement(vector<int>& nums) {

        int candidate = nums.at(0);
        int count = 1;
        for (int i = 1; i < nums.size(); ++i)
        {
            if (count == 0)
            {
                candidate = nums.at(i);
                count = 1;
            }

            else if (nums.at(i) == candidate) //注意:不能写成if 避免count==0后又进入此分支,使count变为2
                ++count;

            else
                --count;
        }

        return candidate;
    }
  	//随机数
   int majorityElement(vector<int>& nums) {    //每一轮随机选择一个数字,统计出现次数,因为目标出现频率大于二分之一,所以效率较高
        while(true)
        {
            int candidate=nums[rand() % nums.size()],count=0;   
            for(int n:nums)
            {
            if(n==candidate)     
                count++;
            }
            if(count > nums.size()/2)           return candidate;
        }
        return -1;
    }
  
  //位运算
    int majorityElement(vector<int>& nums) {
      int res=0;
      for(int i=0;i<32;i++)
      {
          int ones=0;
          for(int n:nums)
              ones += (n >> i) & 1;                        //位运算法统计每个位置上1出现的次数,每次出现则ones+1
          res += (ones > nums.size()/2) << i;              //如果1出现次数大于2分之1数组长,1即为这个位置的目标数字
      }
      return res;
  }
};
posted @ 2020-03-13 14:07  RioTian  阅读(145)  评论(0编辑  收藏  举报