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 @   RioTian  阅读(153)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
点击右上角即可分享
微信分享提示

📖目录