这是我参与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];
};
思路来源:多数元素
以上就是关于多数元素的题解,不知道对小伙伴们是否有帮助呢?
我们下期见👋👋👋