输入一个数组,求出现次数超过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 };
时间: 2024-10-09 01:32:30