題目:
給定乙個非空且只包含非負數的整數陣列 nums, 陣列的度的定義是指數組裡任一元素出現頻數的最大值。
你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。
示例 1:
輸入: [1, 2, 2, 3, 1]示例 2:輸出: 2
解釋:
輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.
連續子陣列裡面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續子陣列[2, 2]的長度為2,所以返回2.
輸入: [1,2,2,3,1,4,2]注意:- nums.length 在1到50,000區間範圍內。輸出: 6
- nums[i] 是乙個在0到49,999範圍內的整數。
一開始,我的想法是建立乙個字典,將每個數字(不重複的)都作為key存入,value是乙個陣列,裡面儲存該數字所出現位置的索引,陣列最後一位儲存該數字出現的次數;
取value陣列最後一位的最大值即為該輸入陣列的度;
然後取各個key的value內的索引
取滿足該數字的度== 陣列的度 的 min(最大值-最小值+1) ;
程式:
class
solution:
deffindshortestsubarray
(self, nums):
""" :type nums: list[int]
:rtype: int
"""pos = {}
n = 1
setnums = list(set(nums))
lengent, minlengent = len(nums), len(nums)
for i in range(len(setnums)):
count = 0
localn = 0
pos[setnums[i]] =
for j in range(len(nums)):
if setnums[i] == nums[j]:
count += 1
n = max(n, count)
localn = count
for l in pos.keys():
if len(pos[l]) >= 3
and pos[l][-1] == n:
# lengent = max(pos[l][:-1]) - min(pos[l][:-1])
lengent = pos[l][-2] - pos[l][0] + 1
elif len(pos[l]) < 3
and pos[l][-1] == n:
lengent = 1
minlengent = min(minlengent, lengent)
return minlengent
但結果在倒數第二個測試用例上卡住了,顯示超時,說明這樣做執行速度太慢;
於是就借鑑了一下別人的思路:
1. 首先將陣列內的元素作為key建立乙個字典,value為統計的出現頻次,將出現頻次最高的取出來放到乙個list中,如果最高頻次是1,則返回1
2. 遍歷list中的值,在陣列中從兩邊開始找,找到與list中元素相等最左和最右位置j,k,length=k-j+1
3. 返回最小的length即為最後的值
這個思路顯然要比我的效率高多了,於是就按照這個思路開始寫程式:
完整程式:
class
solution:
deffindshortestsubarray
(self, nums):
""" :type nums: list[int]
:rtype: int
"""nums_dict = {}
maxfreq =
maxlengent = len(nums)
for i in nums:
if i not
in nums_dict:
nums_dict[i] = 1
else:
nums_dict[i] += 1
freq = list(nums_dict.values())
if max(freq) == 1:
return
1for i in range(len(freq)):
if freq[i] == max(freq):
for j in range(len(maxfreq)):
freqnum = list(nums_dict.keys())[maxfreq[j]]
for num1 in range(len(nums)):
if nums[num1] == freqnum:
a = num1
break
for num2 in range(len(nums)-1,-1,-1):
if nums[num2] == freqnum:
b = num2
break
lengent = b-a+1
maxlengent = min(maxlengent, lengent)
return maxlengent
提交結果:
結果看起來果然不錯。
LeetCode697 陣列的度
給定乙個非空且只包含非負數的整數陣列nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與nums擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相同度的...
LeetCode 697 陣列的度
給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相同度的...
leetcode697 陣列的度
給定乙個非空且只包含非負數的整數陣列 nums,陣列的度的定義是指數組裡任一元素出現頻數的最大值。你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。示例 1 輸入 1,2,2,3,1 輸出 2 解釋 輸入陣列的度是2,因為元素1和2的出現頻數最大,均為2.連續子陣列裡面擁有相...