Majority Element II

题意:找出数组中元素个数超过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 };

 

posted @ 2015-07-07 16:51  醉剑客  阅读(2452)  评论(0编辑  收藏  举报