题目描述
给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
注意:nums的长度[1,50000]
示例
输入: [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.
输入: [1,2,2,3,1,4,2]
输出: 6
解答
要使子数组的度与原数组一致,则原数组中出现最多次的数a要全部包括在子数组中。即子数组为从a第一次出现到a最后一次出现时,最短。
如果存在多个不同的a,取最短的数组。
类似于求众数的那道提,可以利用字典(哈希)
class Solution(object):
def findShortestSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 要使子数组的度与原数组一致,则原数组中出现最多次的数a要包括在子数组中
# 则子数组为从a第一次出现到a最后一次出现时,最短
# 如果存在多个不同的a,取最短的数组
# 类似于求众数的那道提,可以利用字典(哈希)
length = len(nums)
# index:用于记录每个元素出现的位置索引,键-数组元素,值-列表,出现的位置
# 值(列表)的长度即为该元素出现的次数
indexs = dict()
for num in nums:
indexs[num] = []
for i in range(0,length):
num = nums[i]
indexs[num].append(i)
max_count = 1
min_len = length
for num,index in indexs.items():
count = len(index)
cur_len = index[-1] - index[0] + 1
# 判断是否是出现次数最多的数
if count>max_count:
max_count = count
min_len = cur_len
# 如果两个元素出现次数相同,则取子数组长度小的那个
if count==max_count and cur_len<min_len:
max_count = count
min_len = cur_len
return min_len