面试题 17.10. 主要元素

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

方法一:Boyer-Moore 投票算法

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
  let n = nums.length;
  let candidate = -1;
  let count = 0;
  for(let num of nums){
    if(count === 0){
      candidate = num;
    }
    if(num === candidate){
      count += 1;
    }else{
      count -= 1;
    }
  }
  count = 0;
  for(let num of nums){
    if(num === candidate){
      count += 1;
    }
  }
  return (2*count > n) ? candidate : -1;
};

方法二:哈希

 var majorityElement = function(nums) {
  let map = new Map();
  let n = nums.length;
  let max = 0;
  let res = -1;
  for(let num of nums){
      map.set(num, (map.get(num) || 0) + 1);
      let cur = map.get(num);
      if(cur > max){
          max = cur;
          res = num;
      }
  }
  return (2*max > n) ? res : -1;
};

示例 1:

输入:[1,2,5,9,5,9,5,5,5]
输出:5

示例 2:

输入:[3,2]
输出:-1

示例 3:

输入:[2,2,1,1,1,2,2]
输出:2
posted @ 2021-07-09 09:29  尖子  阅读(71)  评论(0编辑  收藏  举报