剑指offer_39_数组中出现次数超过一半的数字【javascript】

60 阅读1分钟

题目链接

leetcode.cn/problems/sh…

题目

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组[1, 2, 3, 2, 2, 2, 5, 4, 2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

限制:

题解

Boyer-Moore 摩尔投票算法

算法复杂度分析

  • 时间复杂度:O(n)。Boyer-Moore 算法只对数组进行了一次遍历。
  • 空间复杂度:O(1)。Boyer-Moore 算法只需要常数级别的额外空间。
/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    let res = 0, count = 0;
    for(let num of nums) {
        if (!count) {
            res = num;
            count++;
        } else {
            count += num === res ? 1 : -1
        }
    }
    return res;
};

哈希表

算法复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。
/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
    let mid = nums.length >> 1;
    let countMap = {};
    for(let num of nums){
        const numCount = !countMap[num] ? 1 : countMap[num] + 1;
        if (numCount > mid) {
            return num;
        }
        countMap[num] = numCount;
    }
};
// 第二种
var majorityElement = function(nums) {
    if(!nums||!nums.length){
        return null;
    }
    let map = new Map();
    for(let i = 0;i<nums.length;i++){
        let cur = nums[i];
        if(map.has(cur)){
            map.set(cur,map.get(cur) + 1);
        } else {
            map.set(cur,1);
        }
    }
    let mid = nums.length >> 1;
    for( [key,value] of map){
        if(value > mid){
            return key;
        }
    }
};