算法(TS):多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

解法一:排序

多数元素在数组中至少占一半,因此将数组生序或者降序排列,中间位置的元素一定是多数元素。

ini 复制代码
function majorityElement(nums: number[]): number {
    const sortedNums:number[] = []
    const len = nums.length
    for (let i = 0; i < len; i++) {
        let insertIndex = 0;
        while(insertIndex <= sortNums.length) {
            if (insertIndex === sortedNums.length || sortedNums[insertIndex] > nums[i] ) {
                sortedNums.splice(insertIndex,0, nums[i])
                break
            }
            insertIndex++
        }
    }
    const m = Math.floor(sortedNums.length / 2)
    return sortedNums[m]
};

有嵌套循环因此时间复杂度为 O(n * n),有额外的中间量存储空间,空间复杂度为 O(n)

解法二:hash 表

用一个 map 统计数组中元素出现的次数,key 为 数组中的元素,value 为元素出现的次数,统计结束,判断哪个元素出现的次数大于 ⌊ n/2 ⌋,满足要求的元素是多数元素。

typescript 复制代码
function majorityElement(nums: number[]): number {
  const countMap = new Map<number,number>()
  nums.forEach(num => {
    const curCount = countMap.get(num) || 0
    countMap.set(num,curCount + 1)
  })

  const maxCount = Math.round(nums.length / 2)
  for (const [number, count] of countMap) {
    if (count >= maxCount) {
      return number
    }
  }
}

countMap.size 的最大值为 n/2,两次遍历的时间复杂度为 O (n + n/2) => O ( 2 * n), 有额外的中间量存储空间,空间复杂度为 O(n)

解法三:摩尔投票法

假设,数组中的元素是人,相同元素属于相同的团,元素的数量是团的人数,让不同团的两两决战,每人只能决战一次,决战之后离开团,这些团剩下的人就是多数元素.

ini 复制代码
function majorityElement(nums: number[]):number {
  let majority
  let count = 0

  nums.forEach(num => {
    if (count === 0) {
      majority = num
    }

    if (num === majority) {
      count ++
    }

    if (num !== majority) {
      count --
    }
  })

  return majority
}

时间复杂度O(n),空间复杂度 O(1)

相关推荐
生成论实验室6 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第二篇:阴阳博弈——认知的动力学基础
数据结构·人工智能·科技·神经网络·算法
We་ct35 分钟前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
风筝在晴天搁浅35 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发37 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星43 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅1 小时前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
weixin_427771611 小时前
前端调试隐藏元素
前端
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师2 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数