题目
给定一个大小为 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) } }