題意:找出數組中元素個數超過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 };