• 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;
      }
    };
    
  • 相关阅读:
    互联网对实体经济的三轮冲击
    虎嗅网
    RabbitMQ实战-死信队列
    RabbitMQ实战
    Hadoop之MapReduce流程
    Hadoop之HDFS读写流程
    GitHub预览网页[2019最新]
    Java操作Hadoop集群
    Hadoop分布式集群搭建
    Hadoop Local(本地)模式搭建
  • 原文地址:https://www.cnblogs.com/RioTian/p/12486143.html
Copyright © 2020-2023  润新知