E-697. Degree of an Array

# 这傻逼easy题写了老子半个小时
# 思路是, 用一个freq dict来记录频率, 用一个left字典记录数字最左的index, 一个right字典
# 记录数字最右的index.
# 1. 遍历整个nums, 在left字典里还没有num这个数字时, 往里面填一次index, 即最左index;
# 最右index看到相应的num就更新right[index]. 频率表看到num就+1
# 2. 通过max(dict.values())找到最大的频率(即degree)
# 3. 遍历freq dict, 如果找到拥有最大频率的num, 计算其right[num] - left[num] + 1, 并
# 更新当前最短的array长度. 最后输出结果
 
from collections import defaultdict
class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        left, right = {}, {}
        freq_map = defaultdict(int)
        for i, num in enumerate(nums):
            if not left[num]:
                left[num] = i
            right[num] = i
            freq_map[num] += 1
        
        res = len(nums)
        degree = max(freq_map.values())
        for num in freq_map:
            if freq_map[num] == degree:
                res = min(res, right[num] - left[num] + 1)
        
        return res

Last updated

Was this helpful?