Skip to content

169. 多数元素

js
;(function () {
  /**
   * 169. 多数元素
   * 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
   * 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
   *
   * 输入:nums = [3,2,3]
   * 输出:3
   *
   * 输入:nums = [2,2,1,1,1,2,2]
   * 输出:2
   *
   * 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
   *
   */

  function majorityElement(nums: number[]): number {
    // 方法一:排序法
    // // 思路: (如果满足数组非空且总是存在多数元素的话)数组排序,数组最中间的那个数字就是的
    // let index = Math.floor(nums.length/2);
    // return nums.sort((a, b) => a - b)[index]

    // 方法二:计数法
    // type typeObj = {
    //     [prop: string]: number
    // }
    // let temp: typeObj = {};
    // let rtn: number = -1;
    // for(let i = 0; i < nums.length; i++) {
    //     temp[nums[i]] ? temp[nums[i]]++ : temp[nums[i]] = 1;
    // }
    // for(let k in temp) {
    //     temp[k] > nums.length/2 ? rtn = +k : null;
    // }
    // return rtn

    // 方法三:摩尔投票法
    let rtnArr: number[] = []
    for (let i = 0; i < nums.length; i++) {
      let rtnLen = rtnArr.length
      if (rtnLen > 0) {
        rtnArr[0] !== nums[i] ? rtnArr.pop() : rtnArr.push(nums[i])
      } else {
        rtnArr.push(nums[i])
      }
    }
    return rtnArr[0]
  }

  let nums = [2, 2, 1, 1, 1, 2, 2]
  let nums2 = [3, 2, 3]
  console.log(majorityElement(nums))
  console.log(majorityElement(nums2))
})()