题目
解题思路
第一步,统计出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