1. 程式人生 > >LeetCode刷題229. Majority Element II

LeetCode刷題229. Majority Element II

題目描述:

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