LeetCode 之 JavaScript 解答第229題 —— 求衆數 II(Majority Element)


Time:2019/4/5
Title: Majority Element 2
Difficulty: medium
Author: 小鹿javascript


問題:Majority Element 2

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times.java

Note: The algorithm should run in linear time and in O(1) space.git

Example 1:github

Input: [3,2,3]
Output: [3]

Example 2:算法

Input: [1,1,1,3,3,2,2,2]
Output: [1,2]

solve:

▉ 算法思路:
一、上一篇是一個求超過 n/2 個數的數,採起的是用一個計數變量和計數元素變量來完成的。本篇題目是超過 n/3 的個數, 咱們分別用兩個變量來完成, 條件限制是時間複雜度是O(n),空間複雜度爲O(1)

二、繼續使用摩投票算法,假設要投票,選取票數超過 n/3 以上選爲候選人,一個 n 被分爲三等份,也就是說最多有兩位當選人。編程

三、假設第一我的投甲,第二個投乙,甲、乙都站到臺上各個計數爲 1 ,隨之第三個投甲,第四個投乙,計數分別加 1 ,第五個投丙,由於只有兩個臺子,因此那就讓甲乙票數計數各減 1 ,當甲、乙的票數分別減到 0 以後,第 m 我的投丙,就讓丙代替甲或已,繼續遍歷數據,直到遍歷完成爲止。app

四、上述只選擇出了那些有可能知足條件的數據,下面對cm、cn存儲的數據作驗證。測試

▉ 其餘解法:
若是沒有題目中時間複雜度和空間複雜度的限制,有多種解決方法:

一、散列表解決:先遍歷一遍數據,統計每一個數字出現的次數,而後再遍歷一遍散列表,找出知足條件的數字。時間複雜度爲O(n),空間複雜度爲 O(n)。spa

二、排序解決:先進行一次排序(快排),而後遍歷數據,找出知足條件的數據。時間複雜度爲O(nlogn),空間複雜度爲O(1)。code

▉ 代碼實現:
/**
        * @param {number[]} nums
        * @return {number[]}
        */
        var majorityElement = function(nums) {
            let [m,n,cm,cn,countm,countn] = [0,0,0,0,0,0];
            let result = [];
            
            for(let i = 0;i < nums.length; ++i){
                //m === nums[i]和n === nums[i]的判斷必定放到 cm === 0 和 cn === 0 以前,負責產生 bug。
                if(m === nums[i]){
                    cm ++;
                }else if(n === nums[i]){
                    cn ++;
                }else if(cm === 0){
                    m = nums[i];
                    cm ++;
                }else if(cn === 0){
                    n = nums[i];
                    cn ++;
                }else{
                    cn--;
                    cm--;
                }
            }
            //驗證 cm、cn 存儲的數據
            for(let index in nums){
                if(nums[index] === m){
                    ++countm;
                }
                if(nums[index] === n){
                    ++countn;
                }
            }
            
            if(countm > Math.floor(nums.length/3)){
                result.push(m);
            }
        
            if(countn > Math.floor(nums.length/3) && n != m){
                result.push(n);
            }
            return result;
        };

        //測試
        let arr =[1,2,2,3,2,1,1,3];
        console.log(majorityElement(arr));

歡迎一塊兒加入到 LeetCode 開源 Github 倉庫,能夠向 me 提交您其餘語言的代碼。在倉庫上堅持和小夥伴們一塊兒打卡,共同完善咱們的開源小倉庫!
Github:https://github.com/luxiangqia...

歡迎關注我我的公衆號:「一個不甘平凡的碼農」,記錄了本身一路自學編程的故事。
相關文章
相關標籤/搜索