思考:本题目主要是找出数组的度,然后根据度对应的数值找到最短的子数列(度相同),以[2,3,4,3,6,7,7]
为例。
第一步我们就找到数组的度,由题意的得,数组的度就是数组中最高频数字出现的个数。我们可以组成一个字典,键值为nums中的数,我们统计每个数出现的个数{2: 1, 3: 2, 4: 1, 6: 1, 7: 2}。找出数组的度du=2,并反求出数值对应具体集合jihe = {3, 7} 。
通过数值集合组成一个空的字典。例如dict_1={3:[], 7:[]}。
我们统计出集合中数值出现的位置dixt_1={3: [1, 3], 7: [5, 6]},通过结束位置-起始位置+1得到子集的最小长度。集合du_list=[3,2]最小的值,即为子集的最小长度2。
class Solution(object): def findShortestSubArray(self, nums): """ :type nums: List[int] :rtype: int """ import copy keys = set(nums) #删掉重复的数据 dict_0 = dict.fromkeys(keys,0) #将重复的数据删除后,组成一个字典 for num in nums:# 对nums进行遍历,相同时候value加1 dict_0[num] += 1 du =max(dict_0.values()) #最大的值即为列表的度 res =[] #求出度对应数据的集合jihe = {3, 7} for i in dict_0: if dict_0[i] == du: res.append(i) jihe = set(res) dict_1 = {} #以集合的值为key组成再点dict_1{3: [], 7: []} for i in jihe: dict_1[i] = copy.deepcopy([]) du_list = [] #遍历找到相同元素的位置并存储 for i,num in enumerate(nums): for j in jihe: if j == num: dict_1[j].append(i) for j in jihe: du_list.append(max(dict_1[j])-min(dict_1[j])+1) return min(du_list) a = Solution() a.findShortestSubArray([2,3,4,6,7,7])