标签:
题意:找出数组中元素个数超过n/3的元素.
思路:1, 超过n/3的元素个数最多两个
2, 数组中连续3个数据为一组的话,一共n/3组,那么如果存在符合条件的元素,这个元素一定出现在某一个组内两次
3, 知道了以上两个条件后,用所谓的摩尔投票法,共两轮,
第一轮:找出出现次数最多的两个元素,每次存储两个元素n1和n2,如果第三个元素与其中一个相同,则增加计数cn1或cn2, 否则,清除n1和n2,从下一个数据开始重新统计.
根据第二条,数目较多的元素一定可以被查到,当然查到的不一定是大于n/3的.
第二轮:验证这两个元素是否满足条件,即出现的次数是否大于n/3;
1 class Solution { 2 public: 3 vector<int> majorityElement(vector<int>& nums) { 4 vector<int> v; 5 int size = nums.size(); 6 int n1=0,n2=0,cn1=0,cn2=0; 7 for(int i=0;i<size;i++) 8 { 9 if(nums[i]==n1) 10 { 11 cn1++; 12 } 13 else if(nums[i]==n2) 14 { 15 cn2++; 16 } 17 else if(cn1==0) 18 { 19 n1 = nums[i]; 20 cn1 = 1; 21 } 22 else if(cn2==0) 23 { 24 n2 = nums[i]; 25 cn2 = 1; 26 } 27 else 28 { 29 cn1--; 30 cn2--; 31 } 32 } 33 if(cn2==0&&size>0)//用来解决[0 0]的情况 34 n2=nums[0]-1; 35 cn1=0; 36 cn2=0; 37 for(int i=0;i<size;i++) 38 { 39 if(nums[i]==n1) 40 cn1++; 41 if(nums[i]==n2) 42 cn2++; 43 } 44 if(cn1>size/3) 45 v.push_back(n1); 46 if(cn2>size/3) 47 v.push_back(n2); 48 return v; 49 } 50 };
标签:
原文地址:http://www.cnblogs.com/ZhangYushuang/p/4627503.html