LeetCode 之 JavaScript 解答第229题 —— 求众数 II(Majority Element)

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

问题:Majority Element 2

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]

solve:

▉ 算法思绪:

1、上一篇是一个求凌驾 n/2 个数的数,采用的是用一个计数变量和计数元素变量来完成的。本篇问题是凌驾 n/3 的个数, 我们离别用两个变量来完成,
前提限定是时候复杂度是O(n),空间复杂度为O(1)

2、继承运用摩投票算法,假定要投票,拔取票数凌驾 n/3 以上选为候选人,一个 n 被分为三等份,也就是说最多有两位当选人。

3、假定第一个人投甲,第二个投乙,甲、乙都站到台上各个计数为 1 ,随之第三个投甲,第四个投乙,计数离别加 1 ,第五个投丙,由于只要两个台子,所以那就让甲乙票数计数各减 1 ,当甲、乙的票数离别减到 0 以后,第 m 个人投丙,就让丙替代甲或已,继承遍历数据,直到遍历完成为止。

4、上述只挑选出了那些有能够满足前提的数据,下面临cm、cn存储的数据做考证。

▉ 其他解法:

假如没有问题中时候复杂度和空间复杂度的限定,有多种处理方法:

1、散列表处理:先遍历一遍数据,统计每一个数字涌现的次数,然后再遍历一遍散列表,找出满足前提的数字。时候复杂度为O(n),空间复杂度为 O(n)。

2、排序处理:先举行一次排序(快排),然后遍历数据,找出满足前提的数据。时候复杂度为O(nlogn),空间复杂度为O(1)。

▉ 代码完成:
      /**
        * @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…

迎接关注我个人民众号:「一个不甘寻常的码农」,记录了本身一起自学编程的故事。

    原文作者:小鹿
    原文地址: https://segmentfault.com/a/1190000018772649
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞