Leetcode 697.数组的度

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

提交结果

结果看起来果然不错。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值