[LeetCode169. 多数元素]|刷题打卡

149 阅读1分钟

题目描述

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

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

示例 2:

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

思路分析

  1. 看到这个题目的第一个思路就是把每个数字出现了多少次记录下来,然后比大小,就可以得出结果。我用了额外对象空间来存储每个数的数量,空间复杂度为O(n),用了一重 for循环,时间复杂度O(n).
  2. 看到题解后了解到另外一个比较经典的思路投票算法,众数个数至少比非众数多一,把COUNT加减当作一个众数抵消掉一个非众数,剩下的一定是众数

AC代码

计算每个数的个数,找最多

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
 let kind = {}
 nums.forEach( res => {
    if(kind[res]){
        kind[res]++
    }
    else {
        kind[res] = 1 
    }
 })
 let max = -Infinity
 let result = 0
 for(let key in kind) {
     if(kind[key]>max) {
         max = kind[key]
         result = key
     }
 }
 return result
};

投票法

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
  let count = 0
  let candidate = null
  for(let i = 0; i < nums.length; i++) {
    if(count===0) {
     candidate = nums[i]
    }
    count += (candidate===nums[i] ? 1 : -1)
   
  }
  return candidate
};

总结

投票法这个思路,不相同的就抵消,最后肯定只剩下多的,感觉到了算法的神奇!