数组、位运算、摩尔投票法————求众数
给定一个大小为 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 };