class Solution:
def findShortestSubArray(self, nums: List[int]) -> int:
""" tc O(N) sc O(M) M: number of unique val
1. find val with max freq
2. find last time idx with val and first time
3. return diff
"""
mcnt = -1
mval = nums[0]
d = {}# val: [cnt,first,last]
cnt_val = collections.defaultdict(list)
for i,x in enumerate(nums):
if x not in d:
d[x] = [1,i,i]
else:
d[x][0] += 1
d[x][2] = i
if d[x][0] > mcnt:
mcnt = d[x][0]
mval = x
cnt_val[d[x][0]].append(x)
return min([d[x][2]-d[x][1] for x in cnt_val[mcnt]]) + 1