力扣刷题:多数元素

81 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:多数元素

给定一个大小为 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)];
};

执行结果如下图:

image-20230606214142832.png

代码解读

在上面的代码中,我们首先使用数组的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;
        }
    }
};

执行结果如下图:

image-20230606214406509.png

代码解读

在上面的代码中,使用一个哈希表来统计每个元素出现的次数。然后遍历数组,对于每个元素,在哈希表中更新它出现的次数,并判断它是否为多数元素。如果是,则返回该元素。

时间复杂度为O(n),其中n为数组长度。空间复杂度为O(n)