前言:锻炼自己的思想,规范自己的编程思路。
问题:多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:(放代码里面)
示例1:输入:nums = [3,2,3]
输出:3
示例2:输入:nums = [2,2,1,1,1,2,2]
输出:2
思路1
一种简单的解法是将数组排序,然后返回中间位置的元素。由于多数元素出现次数大于⌊n/2⌋,所以排序后中间位置的元素一定是多数元素。
基于上述思考,代码如下:
var majorityElement = function(nums) {
nums.sort((a,b) => a - b);
return nums[Math.floor(nums.length/2)];
};
执行结果如下图:
代码解读
在上面的代码中,我们首先使用数组的sort方法将数组排序,然后返回中间位置的元素。
这种解法的时间复杂度为O(nlogn),其中n为数组长度。空间复杂度为O(1)。
思路2:
一种解法是使用哈希表来统计每个元素出现的次数。然后遍历哈希表,找到出现次数大于⌊n/2⌋的元素并返回。
基于上述思考,代码如下:
var majorityElement = function(nums) {
let map = new Map();
for (let num of nums) {
map.set(num, (map.get(num) || 0) + 1);
if (map.get(num) > nums.length / 2) {
return num;
}
}
};
执行结果如下图:
代码解读
在上面的代码中,使用一个哈希表来统计每个元素出现的次数。然后遍历数组,对于每个元素,在哈希表中更新它出现的次数,并判断它是否为多数元素。如果是,则返回该元素。
时间复杂度为O(n),其中n为数组长度。空间复杂度为O(n)。