给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
方法一(哈希表):
需要O(n)的时间和空间
var majorityElement = function(nums) {
let l = nums.length
let map = new Map()
let max = 0
let item
for (let i = 0; i < l; i++) {
if(map.has(nums[i])) {
let v = map.get(nums[i])
map.set(nums[i], ++v)
} else {
map.set(nums[i], 1)
}
}
for (let [key, value] of map.entries()) {
if (value > max) {
max = value
item = key
}
}
return item
};
方法二(摩尔投票法 Moore Voting):
需要O(n)的时间和O(1)的空间。
这种投票法先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将下一个值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。
var majorityElement = function(nums) {
let l = nums.length
let val = nums[0]
let count = 1
for (let i = 0; i < l; i++) {
if (val === nums[i]) {
count++
} else {
count--
if (count <= 0) {
val = nums[i]
count = 1
}
}
}
return val
};