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