LeetCode #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

浙公网安备 33010602011771号