LeetCode #697. Degree of an Array

题目

697. Degree of an Array


解题方法

建立三个字典degree、start、end,分别表示每个数字的度、起始位置和终止位置。遍历数组,维护这三个字典。然后找到degree中最大的度maxdegree,设置最小子集长度minarrlength为len(nums),遍历字典degree,找到所有度数为maxdegree的数并根据start和end求得它的起始位置到结束位置之间的长度,取这个长度值的最小值给minarrlength,返回即可。
时间复杂度:O(2n),遍历nums、遍历degree
空间复杂度:O(3n),degree、start、end三个字典


代码

class Solution:
    def findShortestSubArray(self, nums: List[int]) -> int:
        degree = {}
        start = {}
        end = {}
        for i in range(len(nums)):
            if nums[i] not in degree:
                degree[nums[i]] = 1
                start[nums[i]] = i
            else:
                degree[nums[i]] += 1
            end[nums[i]] = i
        
        maxdegree = max(degree.values())
        minarrlength = len(nums)
        for i in degree:
            if degree[i] == maxdegree:
                arrlength = end[i] - start[i] + 1
                minarrlength = min(minarrlength, arrlength)
            
        return minarrlength
posted @ 2020-11-04 15:17  老鼠司令  阅读(69)  评论(0)    收藏  举报