力扣刷题记录#数组#简单#697数组的度

题目描述

给定一个非空且只包含非负数的整数数组 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

你可能感兴趣的:(力扣)