持续创作,加速成长!这是我参与「掘金日新计划 · 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
};