【leetcode刷题】697. 数组的度

度是数组nums里出现频次最高的次数maxCount,找出nums里面度为maxCount的最小子序列的长度。

  • 输入:nums = [1,2,2,3,1]
    输出:2
    度:2,最小子序列[2,2]

  • 思路:用哈希表存储数组里每个元素出现的次数,并记录其出现的第一个下标left和最后一个下标right,计算出left和right差值最小的长度即为答案。

var findShortestSubArray = function(nums) {
    let map = {}
    
    //遍历数组nums,将元素存入哈希表,键是数组元素,值为[出现次数,第一次出现下标,最后一次出现下标]
    for (const [i, val] of nums.entries()) {
      if (val in map) {
        map[val][0] += 1
        map[val][2] = i
      } else {
        map[val] = [1, i, i]
      }
    }
    
	//找出最大的度,并找出最大度的子序列里right-left+1的最小值。
    let maxVal = 0, minLen = 0
    for (const [count, left, right] of Object.values(map)) {
      if (count > maxVal) {
        maxVal = count
        minLen = right - left + 1
      } else if (maxVal == count) {
        if (right - left + 1 < minLen) {
          minLen = right - left + 1
        }
      }
    }

    return minLen
  • 用for of 遍历数组,同时拿到下标和值的方法
for (const [i, val] of nums.entries()){
  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值