题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
本篇内容目的是为了记录自己在做题时候的一些插曲和错误,以及解题思路。水平不高,仍在努力。如需题解,详情可看:
思路:
这道题最重要的应该是解读题目。最开始我的理解就是错的:找到数组内两数之和为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