算法初赛第十四题

题目描述

  1. 数组的度
    给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。
    你的任务是在 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

解法一

解题思路

 1.遍历数组nums,将数组元素,和该元素出现的频率记录到字典d中
 2.遍历字典d,选出value值最大的元素
 3.然后在nums里找到该元素第一次的下标和最后一次出现的下标,二者相减。

python代码

def findShortestSubArray(self, nums: List[int]) -> int:
        d = {}
        for i in nums:
            if i not in d:
                d[i] = nums.count(i)
        Max = max(d.values())
        if Max==1:
            return 1
        else:
            ans = 999999
            for i in d:
                if d[i] == Max:
                    left = nums.index(i)
                    for j in range(left+1,len(nums)):
                        if nums[j]==i:
                            right = j
                    ans = min(ans,right-left+1)
        return ans

运行结果
在这里插入图片描述

解法二

解题思路

1.使用Counter()方法,将数组nums中每个元素出现的频率记到字典d中。
2.逆转数组nums位nums_2.
3.使用max()函数,计算字典d,values的最大值
4.遍历字典d
	4.1如果value == Max
		4.1.1计算key在数组nums第一次出现的位置,以及在nums_2第一次出现的位置,以此来计算他的长度

python代码

def findShortestSubArray(self, nums: List[int]) -> int:
        nums_2 = nums[::-1] #将数组nums逆转
        n = len(nums)
        ans = 99999
        d = Counter(nums)
        Max = max(d.values())
        if Max == 1:
            return 1
        for key,value in d.items():
            if value == Max:
                ans = min(ans,n-nums_2.index(key)-nums.index(key))
        return ans

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值