python:LeetCode之长度最小的子数组

题目:

209. 长度最小的子数组 - 力扣(LeetCode)

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。


本篇内容目的是为了记录自己在做题时候的一些插曲和错误,以及解题思路。水平不高,仍在努力。如需题解,详情可看:

代码随想录 (programmercarl.com)


思路:

这道题最重要的应该是解读题目。最开始我的理解就是错的:找到数组内两数之和为target的元素,返回两元素之间最短距离……

这就让我想到了哈希表,

具体哈希表做法可参考该链接:

python:Leetcode: Q1 两数之和(哈希与字典)_Troysue的博客-CSDN博客

当时还比较沾沾自喜……于是写下如下代码:

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        dict1 = {}
        list1 = []
        for items in range(len(nums)):
            aim = target - nums[items]
            if aim == 0:
                return 1
            elif aim not in dict1:
                dict1[nums[items]] = items
            else:
                dict1[nums[items]] = items
                values = items - dict1[aim] + 1
                list1.append(values)
                values = 0
        if list1 == []:
            return 0    
        
        return min(list1)

报错:

告诉我: target = 15, nums = [1, 2, 3, 4, 5] 这条执行错误

我:(ΩДΩ)???

我明白了,这是要求:子数列中所有元素相加等于target时,最短的那个数列。

(必须批评自己的马虎,这里又忘记了一个“大于”)


换个思路,不用哈希表,用下双指针:

做到这里,我发现自己有一个很严重的问题:思维不够灵活,且容易陷入思维的误区。

快慢指针可以用在本题,快指针可以直接放在for循环中,元素之间的长度也要加。

而慢指针什么时候走呢?当快指针和慢指针之间元素之和大于target的时候要先前走一步。

这里用的是while循环,因为要考虑到慢指针可能需要走多步的情况。

那么字列表长度什么时候输出呢?最开始的想法是将字列表的长度全部放在一个空列表中,遍历结束后再比较大小。

其实完全可以换一个思路:既然我们要求的是最小值,那么先赋给其一个最大值,出现一个较小的值,就将两个值相对比,留下最小的值。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        slow = 0
        sums = 0
        minFigure = 10**5 + 1

        for fast in range(len(nums)):
            sums += nums[fast]
            while sums >= target:
                minFigure = min(minFigure, fast - slow + 1)
                sums -= nums[slow]
                slow += 1
        
        return 0 if minFigure == 10**5 + 1 else minFigure

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值