Leetcode————697.数组的度

题目

在这里插入图片描述

解题思路

第一步,统计出nums的“度”(最大出现频次是多少)对应的数字元素,生成字典(只有key,key是元素数字,value是空列表);
第二步,遍历一遍nums,统计出最大出现频次的数字们的index位置是多少,添加到相应value列表;
第三步,遍历一遍这个字典,求出每个满足题意的数字元素子数组最小长度,就是最前和最后的index之间的差加上1,统计出最短的。

关键在于想到最短连续子数组的长度,它是由位置差得出的。

代码

class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        #按数字出现频度排序
        order = sorted(collections.Counter(nums).most_common(), key = lambda x: x[1])
        #例子:[1, 2, 2, 3, 1] 的 order == [(3, 1), (1, 2), (2, 2)]

        degree = order[-1][1]

        #生成key为最大频度数字,value为空列表的字典
        degree_nums_dict = {i[0]:[] for i in order if i[1] == degree}

        #找出最大频度数字分别出现的位置,添加到对于value
        for i in range(0, len(nums)):
            if nums[i] in degree_nums_dict.keys():
                degree_nums_dict[nums[i]].append(i)

        #计算出最小数组长度
        for k, v in degree_nums_dict.items():
            sub_len = v[-1] - v[0] + 1
            try:
                if sub_len < shortest:
                    shortest = sub_len
            except:
                shortest = sub_len
        return shortest
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值