97.多数元素

4 阅读1分钟

题目链接

给定一个大小为 n **的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

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

解法1 暴力解法

思路

哈希表计数然后再遍历。

代码

function majorityElement(nums: number[]): number {
    const map: Record<number, number> = {};

    for (let num of nums) {
        map[num] = (map[num] || 0) + 1;
    }

    const times = nums.length / 2;

    for (let [k, v] of Object.entries(map)) {
        if (v > times) return Number(k);
    }
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(n)

解法2 Boyer-Moore 投票法

思路

这个算法的前提是一定要有一个数超过一半。 它把多数元素看作“+1 票”,其他元素看作“-1 票”。我们维护一个“候选人”和“当前得票数”:

初始时候选人为空,票数为 0。

遍历每个元素:

  • 如果票数为 0,就把当前元素设为候选人

  • 如果当前元素等于候选人,票数 +1

  • 否则票数 -1

由于多数元素的数量超过一半,它最终会“幸存下来”。

代码

function majorityElement(nums: number[]): number {
    let candidate = nums[0];
    let count = 0;

    for (let num of nums) {
        if (count === 0) {
            candidate = num;
        }

        if (num === candidate) {
            count += 1;
        } else {
            count -= 1;
        }
    }

    return candidate;
};

时空复杂度

时间复杂度:O(n)

空间复杂度:O(1)