1. 程式人生 > >Leetcode 229.求眾數II

Leetcode 229.求眾數II

求眾數II

給定一個大小為 的陣列,找出其中所有出現超過  n/3  次的元素。

說明: 要求演算法的時間複雜度為 O(n),空間複雜度為 O(1)。

示例 1:

輸入: [3,2,3]

輸出: [3]

示例 2:

輸入: [1,1,1,3,3,2,2,2]

輸出: [1,2]

 

摩爾投票法的基本思想很簡單,在每一輪投票過程中,從陣列中找出一對不同的元素,將其從陣列中刪除。這樣不斷的刪除直到無法再進行投票,如果陣列為空,則沒有任何元素出現的次數超過該陣列長度的一半。如果只存在一種元素,那麼這個元素則可能為目標元素。

解題思路

由於陣列中出現次數超過 13

的數字最多隻可能為兩個,所以記錄兩個數字n1、n2,以及他們出現的次數c1、c2,遍歷陣列並做以下操作:

  • 若當前兩數字出現則把對應的次數加1;
  • 若其中一個出現次數為0,則把當前數字賦給出現次數為0的數字,並將其出現次數置為1;
  • 若當前數字不同於任何一個數字,則將兩數字的出現次數都減1

最後得到兩個數字以及他們出現的次數,再遍歷一遍陣列記錄他們的出現次數,若大於 n3

則加入到結果中。

 

 1 import java.util.ArrayList;
 2 import java.util.List;
3 4 class Solution { 5 public List<Integer> majorityElement(int[] nums) { 6 List<Integer> res=new ArrayList<Integer>(); 7 if(nums==null||nums.length==0) return res; 8 int n1=nums[0],n2=0,c1=1,c2=0; 9 for(int i=1;i<nums.length;i++){ 10 if
(nums[i]==n1) c1++; 11 else if(nums[i]==n2) c2++; 12 else if(c1==0){ 13 n1=nums[i]; 14 c1++; 15 }else if(c2==0){ 16 n2=nums[i]; 17 c2++; 18 }else{ 19 c1--; 20 c2--; 21 } 22 } 23 c1=c2=0; 24 for(int i=0;i<nums.length;i++){ 25 if(nums[i]==n1) c1++; 26 else if(nums[i]==n2) c2++; 27 } 28 if(c1>nums.length/3) res.add(n1); 29 if(c2>nums.length/3) res.add(n2); 30 return res; 31 } 32 }