169. Majority Element

仅供自己学习

 

思路:

用一个hash表直接计数每个元素的个数,并且计数后判断是否大于size/2,如果大于,那么久判断是否大于原来的最大个数的元素的个数,如果大的话就更新最大个数的元素并且记录该元素。

 

代码:

 1 class Solution {
 2 public:
 3     int majorityElement(vector<int>& nums) {
 4         int size=nums.size();
 5         int maxn=0;
 6         int res=0;
 7         unordered_map<int,int> mp;
 8         for(auto& a:nums){
 9             ++mp[a];
10             if(mp[a]>size/2){
11                 if(mp[a]>maxn){
12                     maxn=mp[a];
13                     res=a;
14                 }
15             }
16         }
17         return res;
18     }
19 };

 

还有一种通过二分法来求解,利用的是如果有一个数的个数>size/2,那么他在分出来的左边和右边 l/2+r/2<=size/2,否则不满足他是众数,所以一直二分,回溯之后就返回当前序列的众数,再通过比较,由于众数的性质,最后一定会获得正确的众数。

代码:

 1 class Solution {
 2 public:
 3     int count(vector<int>& nums,int target,int low,int high){
 4         int cnt=0;
 5         for(int i=low;i<=high;++i){ //计数low-high的与target相等的数的数量
 6             if(nums[i]==target)
 7                 cnt++;
 8         }
 9         return cnt;
10     }
11     int divide(vector<int>& nums,int low,int high){
12         if(low==high)
13             return nums[low];
14         int mid=(low+high)/2;
15         int left_majorityElement=divide(nums,low,mid);  //返回low~high二分出的左小序列的众数
16         int right_majorityElement=divide(nums,mid+1,high); //返回右小序列的众数
17         if(count(nums,left_majorityElement,low,high)>(high-low+1)/2) return left_majorityElement;     //是当前low~high的范围判断是否为众数,不是该low-high分出的左右小序列
18         if(count(nums,right_majorityElement,low,high)>(high-low+1)/2) return right_majorityElement;  //因为是左右小序列合并的序列,所以一旦发现一个众数,即数量大于size/2后,就直接返回,因为不会有第二个这种数了,也就如果左小序列的众数是,那么右小序列的众数就一定不是
19         return -1;
20     }
21     int majorityElement(vector<int>& nums) {
22         return divide(nums,0,nums.size()-1);
23     }
24 };

 

posted @ 2021-03-11 11:31  Mrsdwang  阅读(44)  评论(0)    收藏  举报