「栈」leetcode 169.多数元素(简单)

156 阅读2分钟

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

一、了解题目

附上原题链接:169. 多数元素

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

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

示例 1:

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

示例 2:

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

二、题解分析

依据以上题意,我们先来谈论一种思路;抵消思路思路如下:

  • 每一个出现最多的数其他不同的数进行抵消,因为最多的数大于一半,所以最后剩下的肯定就是最多的数。
  • count 来表示抵消,相同 +1 ,不同抵消 -1
  • 一开始假设 nums[0] 是最大的数,如果遍历开始就发现 count==0 ,被抵消了,那么马上换最大值。

依据以上这种抵消思想,我们还可以用来实现:

  • nums[0] 入栈,同时遍历 nums 数组;
  • 如果栈空,则直接入栈,并跳过此轮循环;
  • 如果栈不为空时,则判断此时栈的最后一个元素是否与遍历的元素相等;
  • 相等则入栈,不相等则出栈;
  • 遍历完成后,该抵消的都抵消,最后剩下的栈顶元素肯定是出现最多的数

三、代码实现

依据上面的题解,我们将用 js 来实现这道题。具体实现代码如下:

/**
 * @description leetcode 160.多数元素
*//**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function (nums) {
    // 1.将nums[0]进行入栈操作
    let stack = [nums[0]];
    // 2.遍历nums数组
    for (let i = 1; i < nums.length; i++) {
        // 2.1 如果栈空,则直接入栈,跳过此轮循环
        if (stack.length === 0) {
            stack.push(nums[i]);
            continue;
        }
        // 2.2 如果栈不为空时,判断此时栈的最后一个元素是否与遍历的元素相等
        if (stack[stack.length - 1] === nums[i]) {
            // 2.2.1 相等入栈
            stack.push(nums[i]);
        } else {
            // 2.2.2 不相等出栈
            stack.pop();
        }
    }
    // 3.返回栈顶元素
    return stack[stack.length - 1];
};

思路来源:多数元素

以上就是关于多数元素的题解,不知道对小伙伴们是否有帮助呢?

我们下期见👋👋👋