JS算法-多数元素

207 阅读2分钟

题目

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

坚持努力,无惧未来!