Leetcode 169. 多数元素

56 阅读2分钟

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

1.题目

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]
输出:2

2.思路

本题需要返回数量大于总数50%的元素,我们可以考虑通过一个hash表来存储每种颜色的数量,然后通过一轮遍历将每个元素都保存进表中,并且将其添加进hash表,最后比较出数量最大的数字。

我们也可以采用将一个数组分成两个个子数组,然后子数组的多数元素进行比较,较大的就是大数组的多数元素,我们可以通过递归的方法,将数组不停的拆分到只有一个为止,然后比较大小并合并回来,最后得到的就是多数元素了。

但是题目还有个要求使用常熟级的额外空间,而上面的方法都不能满足这个要求,所以我们需要其他的办法,因为多数元素是大于50%,那么其他元素加起来都没有多数元素多,我们可以将数组进行一轮遍历,遇到一个元素将他设置为多数元素,并且记录数量加1,然后遇到相同元素的就继续增加1,如果遇到其他元素的时候就减少一个,如果数量为0的时候就记录新元素作为多数元素,当一轮遍历结束后,当前设置的元素就是多数元素。

var majorityElement = function(nums) {
    let obj = {
        count:0,
        name:0
    }
    nums.forEach(item=>{
        if(obj.count===0){
                obj = {
                    count:0,
                    name:item
                }
            }
        if(item===obj.name){
            obj.count+=1
        }else{
            obj.count-=1
            
        }
    })
    return obj.name
};