leetcode-Majority Element II-229
Posted 0_summer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章
leetcode-Majority Element II-229
说 element1, element2 display: inline block; 和 element1 + element2 (display: inline block;) 有啥区别? [复制
Raphael.js API 之Element.remove(),Element.removeData(),paper.text(),Element.node(),Element.onDragOver
Print 'element' in list 返回一个 <Element 'element 1' at 0x0000013C6D4B9270>