LeetCode刷題229. Majority Element II
阿新 • • 發佈:2018-12-14
題目描述:
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
Example 1:
Input: [3,2,3]
Output: [3]
Example 2:
Input: [1,1,1,3,3,2,2,2]
Output: [1,2]
思路解析:
你是否還記得LeetCode的第169題Majority Element,本題是169題的拓展題,⌊ n/2⌋
⌊ n/3 ⌋
,在時間複雜度(線性時間複雜度)和空間複雜度(O(1))上提出了更高的要求。
在Majority Element中提出了一種摩爾投票演算法,本題也可以用摩爾投票演算法進行處理,只是稍微有點變化。
有同學不理解為什麼程式碼中只定義了兩個num和兩個count,因為既然題目中已經說了“more than ⌊ n/3 ⌋
times”,那麼就只能有0個,1個或者2個。如果說一個數組為[1,1,1,3,3,3,2,2,2],共有9個元素,1,2,3各有三個,這不是有3個num嗎?並不是這樣的,仔細一看這個陣列,你會發現是找不到任何一個元素使它的個數大於9/3=3個的,它是上面所說的0個的情況。
程式碼如下:
class Solution { public List<Integer> majorityElement(int[] nums) { List<Integer> res = new ArrayList<Integer>(); int num1=0,num2=0; int count1=0,count2=0; for(int i=0;i<nums.length;i++){ if(nums[i]==num1){ count1++; }else if(nums[i]==num2){ count2++; }else if(count1==0){ num1=nums[i]; count1=1; }else if(count2==0){ num2=nums[i]; count2=1; }else{ count1--; count2--; } } count1=0; count2=0; for(int i =0;i<nums.length;i++){ if(num1==nums[i]){ count1++; } else if(num2==nums[i]){ count2++; } } if(3*count1 > nums.length){ res.add(num1); } if(3*count2 > nums.length){ res.add(num2); } return res; } }