697.数组的度
题目描述:给定一个非空且只包含非负的整数组nums,数组的度定义是指数组里任一元素出现频数的最大值。
任务:找到与nums拥有相同大小的度的最短连续子数组,返回其长度
示例:
输入:[1, 2, 2, 3, 1]
输出:2
思路:用3个字典分别存储每个元素第一次出现位置、最后一次出现位置和出现次数,最短的数组就是x的一次出现到最后一次出现的数组。
#参考代码
class Solution:
def findShortestSubArray(self, nums: List[int]) -> int:
"""
定义3个字典,left:每个元素第一次出现的位置
right:每个元素最后一次出现的位置
count:每个元素出现的次数
"""
left,right,count = {}, {}, {}
#i代表的是nums里面每个元素索引值,x代表索引值相对应的值
for i, x in enumerate(nums):
#left只记录元素第一次出现的索引值
if x not in left: left[x] = i
#right记录最后一次出现的位置,需要进行更新
right[x] = i
#count.get(x,0):返回count里键值x所对应的值,不存在则返回0
#记录每个元素出现的次数
count[x] = count.get(x,0) + 1
ans = len(nums)
#count字典里面所有值中的最大值,即出现最多的次数
degree = max(count.values())
for x in count:
if count[x] == degree:
#如果存在,则最小长度等于元素最后一次出现的位置-第一次出现的位置再加上1
ans = min(ans, right[x] - left[x] + 1)
return ans