1. 程式人生 > 實用技巧 >LeetCode #697. Degree of an Array

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