数组、位运算、摩尔投票法————求众数

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

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

示例 1:

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

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

注意:总是存在众数意思是,只有唯一的一个众数,众数的数量至少比第二多的多一个。

方法1:

先排序,中间的那个数肯定就是众数

 1 class Solution {
 2 public:
 3     static bool cmp(const int& a, const int& b){
 4         return a<b;
 5     }
 6     int majorityElement(vector<int>& nums) {
 7         sort(nums.begin(),nums.end(),cmp);//其实不用写cmp,默认升序排序。升序:less<int>();降序:greater<int>()
 8         return nums[nums.size()/2];
 9     }
10 };

方法二:摩尔投票法

栈容器实现:

 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4     stack<int> my_stack;
 5     my_stack.push(nums[0]);
 6     for(int i=1;i<nums.size();i++){
 7         if(my_stack.empty() || my_stack.top() == nums[i]){
 8             my_stack.push(nums[i]);
 9         }
10         else{
11             my_stack.pop();
12         }
13     }
14     return my_stack.top();
15     }
16 };

算法实现:

 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4         int res=nums[0];
 5         int count=1;
 6         for(int i=1;i<nums.size();i++)
 7         {
 8             if(res==nums[i])
 9                 count++;
10             else
11             {
12                 count--;
13                 if(count==0)
14                     res=nums[i+1];//因为肯定存在众数,所以count=0时候,一定存在i+1
15             }
16         }
17         return res;
18     }
19 };
原文地址:https://www.cnblogs.com/pacino12134/p/10994411.html