JavaScript 求解多数元素的两种算法实现
本文详解在 JavaScript 中求解多数元素的两种方法。多数元素定义为出现次数大于 ⌊n/2⌋ 的元素。第一种方法利用 Map 统计频率,时间复杂度 O(n),空间复杂度 O(n);第二种方法通过排序后取中位数,时间复杂度 O(nlogn),空间复杂度 O(logn)。文章提供完整代码示例及复杂度分析,帮助开发者根据场景选择最优解。
题目:多数元素
给定一个大小为 n 的数组 nums,需要返回其中的多数元素。多数元素的定义是其在数组中出现的次数严格大于 ⌊ n/2 ⌋。
题目假设输入的数组非空,且保证给定的数组中一定存在这样的多数元素。
示例 1:
输入: nums = [3,2,3] 输出: 3
示例 2:
输入: nums = [2,2,1,1,1,2,2] 输出: 2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
解:
方法一:利用 Map 实现
该方法通过一次遍历,使用 Map 存储每个元素及其出现的次数。由于 Map 键的唯一性,可以准确记录频率。随后再次遍历 Map 找出出现次数大于数组长度一半的元素。第一次遍历 Map 的时间复杂度为 O(1)(单次操作),第二次遍历所有键值对的时间复杂度为 O(n),因此总体时间复杂度为 O(n)。然而,由于需要额外开辟一个 Map 来存储数据,空间复杂度同样为 O(n)。
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let map = new Map()
for(let i=0;i<nums.length;i++){
if(map.has(nums[i])){
map.set(nums[i],map.get(nums[i])+1)
}else{
map.set(nums[i],1)
}
}
for(let [key,val] of map.entries()){
if(val>nums.length/2){
return key
}
}
};
方法二:排序法
思路:对数组进行排序。如果存在一个数字的出现频率大于 n/2,那么排序后数组中间位置(即索引为 nums.length / 2 的位置)的元素必然是该多数元素。
复杂度分析:时间复杂度为 O(nlogn),主要取决于排序算法(如快速排序)的时间开销。空间复杂度为 O(logn),这是排序过程中递归栈所需的额外空间。
var majorityElement = function (nums) {
nums.sort((a, b) => a - b);
return nums[Math.floor(nums.length / 2)];
};以上就是前端JavaScript多数元素的算法详解的详细内容,更多关于JavaScript多数元素算法的资料请关注本站其它相关文章!
JavaScript闭包与类(Class)的区别及适用场景对比
2026-11-05 15:48:57
JavaScript入门要学ES6吗?let与箭头函数等新特性解析
2026-11-05 14:49:16
JavaScript 8种数据类型详解:基本类型与引用类型的区别
2026-11-05 14:25:15
怎么在JavaScript中使用async/await优化Ajax异步流程
2026-11-05 13:56:15
JavaScript replace回调函数实现动态正则替换逻辑
2026-11-05 13:52:13
