JavaScript 算法练习(三)- 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

方法一(哈希表):

需要O(n)的时间和空间

var majorityElement = function(nums) {
    let l = nums.length
    let map = new Map()
    let max = 0
    let item
    for (let i = 0; i < l; i++) {
        if(map.has(nums[i])) {
            let v = map.get(nums[i])
            map.set(nums[i], ++v)
        } else {
            map.set(nums[i], 1)
        }
    }
    for (let [key, value] of map.entries()) {
        if (value > max) {
            max = value
            item = key
        }
    }
    return item
};

方法二(摩尔投票法 Moore Voting):

需要O(n)的时间和O(1)的空间。

这种投票法先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将下一个值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。

var majorityElement = function(nums) {
    let l = nums.length
    let val = nums[0]
    let count = 1
    for (let i = 0; i < l; i++) {
       if (val === nums[i]) {
           count++
       } else {
           count--
           if (count <= 0) {
               val = nums[i]
               count = 1
           }
       }
    }
    return val
};

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦