229. Majority Element II

问题:求一个数列中,出现次数>n/3次的数字

Example 1:
Input: [3,2,3]
Output: [3]

Example 2:
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]

  

方法:

占权重法

出现次数>n/3,则可能出现最多两个结果。

将两个待选结果设为n1,n2,同时累计出现次数cout1,cout2。

如果出现非自己和另一个结果的数值,则自己的cout--,来抵消出现的次数。

最终剩下的则为待选结果。

再遍历,求的实际出现次数,

如果>n/3则保存到res结果中。

 

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> majorityElement(vector<int>& nums) {
 4         int n1,n2, cout1=0, cout2=0;
 5         vector<int> res;
 6         for(int n:nums){
 7             if(n==n1&&cout1!=0){
 8                 cout1++;
 9             }else if(n==n2&&cout2!=0){
10                 cout2++;
11             }else if(cout1==0){
12                 n1=n;
13                 cout1=1;
14             }else if(cout2==0){
15                 n2=n;
16                 cout2=1;
17             }else{
18                 cout1--;
19                 cout2--;
20             }
21         }
22         cout1=0,cout2=0;
23         for(int n:nums){
24             if(n==n1) cout1++;
25             if(n==n2) cout2++;
26         }
27         if(cout1>nums.size()/3)res.push_back(n1);
28         if(n1!=n2 && cout2>nums.size()/3)res.push_back(n2);
29         return res;
30     }
31 };

 

posted @ 2020-03-21 14:00  habibah_chang  阅读(94)  评论(0编辑  收藏  举报