【每日LeetCode】手把手教你刷题之多数元素

725 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

两个数组的交集

这是力扣169题

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

image.png  

解题思路

这是一道简单题。从题意上看,容易理解;从代码结构上看,清晰简短。对于这题而言,我将从多方面展开来讲解此题。这题没有难点,而是想通过这题来呈现一下我的解题过程,选择这样一道简单题入手,是为了更好地复现解题思路。接下来就来分别介绍三种不同的解题思路。

排序法

这种方法是最容易的。对数组进行排序,然后如果有一个数字出现的频率次数大于n/2,则在数组nums.length / 2的位置就是这个数。

相关代码如下:

var majorityElement = function(nums) {
    nums.sort((a,b)=>a-b);
    let mid = parseInt((nums.length)/2)
    return nums[mid]
};

循环数组法

除了排序数组,也可以循环数组。首先进行数组遍历,然后用哈希表存储遍历后的数字和对应的个数。如果数字出现的个数大于n/2则,则说明此数为我们需要的结果,最后返回它即可。从本质上理解,此解法和排序法差不多。

相关代码如下:

var majorityElement = function (nums) {
    let half = nums.length / 2;
    let obj = {};
    for (let num of nums) {
        obj[num] = (obj[num] || 0) + 1;
        if (obj[num] > half) return num;
    }
};

计数法

何为计数法?顾名思义,就是将所得的数字记录下来进行统计。首先找到第一个数,记录值和其出现的次数,如果在遍历的过程中 遇到相同的数字则计数加一,遇到不同的则计数减一,直到最后变为零后,结束遍历。相比于前两种方法,这种解法会更难理解一些。所以大家可以结合代码一起多看看这种思路。

相关代码如下:

var majorityElement = function(nums) {
    let temp = nums[0];
    let times = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] === temp) {
            times ++;
        } else {
            times --;
            if (times === 0) {
                temp = nums[i + 1];
                times = 1;
                i++;
            }
        }
    }
    return temp;
};

总结

以上就是对 力扣 169 题多数元素 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。