【算法-LeetCode】169. 多数元素(Map)

本文介绍了LeetCode中的多数元素问题,通过使用Map数据结构来追踪数组中每个元素的出现次数,寻找出现次数超过数组长度一半的元素。在遍历过程中,当元素数量达到一半时直接返回该元素。这种方法在处理多数元素问题时,能够以O(n)的时间复杂度和O(n)的空间复杂度解决问题。
摘要由CSDN通过智能技术生成

169. 多数元素 - 力扣(LeetCode)

发布:2021年10月10日20:15:49

问题描述及示例

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

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

示例 1:
输入:[3,2,3]
输出:3

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解(Map)

总体思路是设置一个目标数量为 half = Math.ceil(nums.length / 2),并用一个 Map 类型的结构 map 来存储 nums 中的数字与其出现次数的映射关系。其中数字为 key,而其出现次数为对应的 value

遍历 nums 数组,并检查当前元素是否已经在 map 中,

  • 如果不在,则将当前元素存入 map 中,并设置其值为 1
  • 如果已经存在,则将其 value 在原来的基础上加一。

在将当前元素放入 map 前,如果发现将当前元素放入 map 后,其数量就能达到 half,则可以立即返回当前元素。

在这里插入图片描述

没有考虑到数组中只有两个相等元素的情况

详解请看下方注释:

/**
 * @param {number[]} nums
 * @return {number}
 */
var majorityElement = function(nums) {
  // 如果nums中的元素数量不超过2,则将第一个元素返回即可
  if(nums.length <= 2) {
    return nums[0];
  }
  // map用来存储数字与其数量的映射关系
  let map = new Map();
  // half 是达标的数量,一旦某个数字的数量达到half,则该数字就为多数元素
  let half = Math.ceil(nums.length / 2);
  // 开始遍历nums
  for(let num of nums) {
    // 如果发现将当前元素放入map后可以达标,那么就可以直接将当前元素返回
    if(map.get(num)+1 === half) {
      return num;
    }
    // 如果map中已经有当前元素,则将其数量在原来基础上加1,否则将其加入map,并设置数量为1
    map.has(num) ? map.set(num, map.get(num) + 1) : map.set(num, 1);
  }
};

提交记录
47 / 47 个通过测试用例
状态:通过
执行用时:68 ms, 在所有 JavaScript 提交中击败了92.17%的用户
内存消耗:41.2 MB, 在所有 JavaScript 提交中击败了50.37%的用户
时间:2021/10/10 20:17	

官方题解

更新:2021年7月29日18:43:21

因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。

更新:2021年10月10日20:19:33

参考:多数元素 - 多数元素 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年10月10日20:20:12
参考:Map - JavaScript | MDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值