一种很菜的做法(暴力),for循环(样例能过一大半呢,复杂度的话。。。)
class Solution:
def findShortestSubArray(self, nums: List[int]) -> int:
n=len(nums)
if n==1:
return n
mx=1
#出现次数最多的计算
for i in range(n):
start=nums[i]
num=0
for j in range(n):
if nums[j]==start:
num+=1
if num>mx:
mx=num
mn=50001
for i in range(n):
set=1
star=nums[i]
for j in range(i+1,n):
if nums[j]==star:
set+=1
if set==mx:
if mn>(j-i):
mn=j-i
return (mn+1)
优化的话无非就是把两层for循环弄掉,改了一下发现不仅要找值,还要记录对应的下标,嗯。
这个时候我们需要用到字典
mp=dict()
mp['key1']='value1'
mp['key2']='value2'
正解:
class Solution:
def findShortestSubArray(self, nums: List[int]) -> int:
n=len(nums)
#创建字典
mp=dict()
#字典中的3个值代表出现次数,首次出现位置,最后一次出现的位置
for i,num in enumerate(nums):
if num in mp:
mp[num][0]+=1
mp[num][2]=i
else:
mp[num]=[1,i,i]
mx=mn=0
for count,left,right in mp.values():
if mx<count:
mx=count
mn=right-left+1
elif mx==count:
#这个:=能够使得赋值语句正确出现在判断语句中
if mn>(span :=right-left+1):
mn=span
return mn
tql