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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM