Leetcode 697.数组的度
题目:
给定一个非空且只包含非负数的整数数组 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:
def findShortestSubArray(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)
# pos.append([setnums[i]])
pos[setnums[i]].append(j)
localn = count
pos[setnums[i]].append(localn)
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:
def findShortestSubArray(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 1
for i in range(len(freq)):
if freq[i] == max(freq):
maxfreq.append(i)
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
提交结果:
结果看起来果然不错。