Leetcode 697 陣列的度

2021-08-21 15:26:55 字數 2898 閱讀 2074

題目:

給定乙個非空且只包含非負數的整數陣列 nums, 陣列的度的定義是指數組裡任一元素出現頻數的最大值。

你的任務是找到與 nums 擁有相同大小的度的最短連續子陣列,返回其長度。

示例 1:

輸入: [1, 2, 2, 3, 1]

輸出: 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.

示例 2:

輸入: [1,2,2,3,1,4,2]

輸出: 6

注意:- nums.length 在1到50,000區間範圍內。

- 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.連續子陣列裡面擁有相...