题目
给定一个大小为
n**的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。
输入: nums = [2,2,1,1,1,2,2]
输出: 2
题解
第一种
我们首先通过右移操作将数组长度除以2,得到变量count,表示出现次数超过一半的元素需要出现的次数,如果数组长度为1,直接返回数组中的唯一元素即可,接下来进行遍历数组中的所有元素,对于遍历到的每个元素num,通过Map来存储它在数组中出现的次数,如果Map中没有这个元素,那么将其出现次数设为1,如果Map中已经有这个元素,那么将其出现次数加1,并判断它的出现次数是否超过了count,如果超过了count,说明找到了主要元素,直接返回该元素即可
function majorityElement(nums){
let count = nums.length >> 1, map = new Map()
if (nums.length === 1) return nums[0]
for (let num of nums) {
if (!map.has(num)) {
map.set(num, 1)
} else {
let counts = map.get(num)
counts++
map.set(num, counts)
if (counts > count) return num
}
}
};
第二种
首先我们定义了一个名为majorityElement的函数,它接收一个数组nums作为参数,然后我们计算了数组的长度n,如果数组长度小于2,直接返回数组中唯一的元素,在随机生成了一个下标x,用于在数组中随机选择一个元素。接下来的循环中,会遍历整个数组,如果数组中的元素等于nums[x],那么计数器sum就会加1。如果sum的值超过了数组长度的一半,那么就找到了主要元素,直接返回nums[x],如果在一次遍历中没有找到主要元素,就将计数器sum重置为0,重新随机生成一个下标x,继续下一轮循环。循环会一直进行下去,直到找到主要元素为止
const majorityElement = (nums) => {
let n = nums.length
if (n < 2) return nums[0]
let x = parseInt(Math.random() * n)
let sum = 0
while (1) {
for (var i = 0; i < n; i++) {
if (nums[i] == nums[x]) {
console.log(nums[x], i);
sum++;
if (sum > n / 2) return nums[x]
}
}
sum = 0
x = parseInt(Math.random() * n)
}
}
坚持努力,无惧未来!