首页 > 代码库 > leetcode-Majority Element II-229
leetcode-Majority Element II-229
输入一个数组,求出现次数超过n/3的元素
这是求出现次数超过n/k的元素系列
把数组以每组k个元素分成n/k,或者n/k+1组(当n%k!=0)时;既然要出现超过n/k次,假设这个元素存在,那么这个元素肯定至少在每组中出现一次,并且可能这样的元素有k-1个,因此还是用抵消法
以求超过n/2的元素为例,既然有个元素出现的次数超过一半,那么把它和其他的元素抵消,最后剩下的还是它
同理,求n/3,也是用非候选的元素和候选元素抵消,最后剩下两个候选元素还要遍历一遍数组求它们出现的具体次数来判断是否真的出现n/3次,因为这里我们假设有2个元素都出现超过n/3次,但是其实可能只有一个元素,所以最后还要判断一下
1 class Solution { 2 public: 3 vector<int> majorityElement(vector<int>& nums) { 4 vector<int> v; 5 int len=nums.size(); 6 if(len==0) return v; 7 if(len==1){ 8 v.push_back(nums[0]); 9 return v;10 }11 int a=nums[0];12 int cnt1=1;13 int b,cnt2=0;14 int ok=0;15 for(int i=1;i<len;i++){16 if(nums[i]==a) cnt1++;17 else if(!ok){18 b=nums[i];19 ok=1;20 cnt2=1;21 }22 else if(nums[i]==b) cnt2++;23 else if(cnt1==0){24 a=nums[i];25 cnt1=1;26 }27 else if(cnt2==0){28 b=nums[i];29 cnt2=1;30 }31 else{32 cnt1--;33 cnt2--;34 }35 }36 cnt1=0,cnt2=0;37 for(int i=0;i<len;i++){38 if(nums[i]==a) cnt1++;39 if(nums[i]==b) cnt2++;40 }41 if(cnt1>len/3) v.push_back(a);42 if(cnt2>len/3) v.push_back(b);43 return v;44 }45 };
leetcode-Majority Element II-229
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。