面试题 17.10. 主要元素
题目来源:面试题 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