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 };

浙公网安备 33010602011771号