题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3]
输出:3
示例 2:
输入:[2,2,1,1,1,2,2]
输出:2
思路分析
- 看到这个题目的第一个思路就是把每个数字出现了多少次记录下来,然后比大小,就可以得出结果。我用了额外对象空间来存储每个数的数量,空间复杂度为O(n),用了一重 for循环,时间复杂度O(n).
- 看到题解后了解到另外一个比较经典的思路投票算法,众数个数至少比非众数多一,把COUNT加减当作一个众数抵消掉一个非众数,剩下的一定是众数
AC代码
计算每个数的个数,找最多
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let kind = {}
nums.forEach( res => {
if(kind[res]){
kind[res]++
}
else {
kind[res] = 1
}
})
let max = -Infinity
let result = 0
for(let key in kind) {
if(kind[key]>max) {
max = kind[key]
result = key
}
}
return result
};
投票法
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let count = 0
let candidate = null
for(let i = 0; i < nums.length; i++) {
if(count===0) {
candidate = nums[i]
}
count += (candidate===nums[i] ? 1 : -1)
}
return candidate
};
总结
投票法这个思路,不相同的就抵消,最后肯定只剩下多的,感觉到了算法的神奇!