题目
难度级别:简单
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3] 输出: 3
示例 2:
输入: [2,2,1,1,1,2,2] 输出: 2
解题思路
投票算法
因为众数大于n/2,假如我们令众数为1,其他数为 -1,那么他们的和一定是正数,至少是1。当我们不知道谁是众数的情况下,我们可以令第一个元素为众数,若下一个元素是它则 1,下一个不是则减1,若减到0,下一个不是它,则令下一个元素是众数,下一个是它则自增。
代码语言:javascript复制const majorityElement = function(nums) {
let candidate = nums[0]
let count = 1
for (let i = 1; i < nums.length; i ) {
if (count === 0) {
candidate = nums[i]
count
}else{
candidate === nums[i] ? count : --count
}
}
return candidate
};
哈希表
将每个元素存为哈希表的key,出现数量存为哈希表的值。通过n记录元素最大数,number记录最大数的数值。
代码语言:javascript复制const majorityElement = function(nums) {
if (nums.length === 1) return nums[0]
let hashMap = new Map()
let n = 0
let number = Infinity
for (let i = nums.length; i >= 0; i--) {
if (hashMap.has(nums[i])) {
let currentNum = hashMap.get(nums[i])
hashMap.set(nums[i], currentNum)
if (n < currentNum) {
n = currentNum
number = nums[i]
}
}else {
hashMap.set(nums[i], 1)
}
}
return number
};
排序
题目提到多数元素大于n / 2,则在排序好的数组的n / 2 1处必为多数元素。
代码语言:javascript复制const majorityElement = function(nums) {
return nums.sort()[Number.parseInt(nums.length/2)]
};
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element