最小大小子数组和结束条件出了什么问题

问题描述 投票:0回答:1

问题

给定一个正整数数组

nums
和一个正整数
target
,返回其子数组的最小长度 总和大于或等于目标。如果没有这样的子数组,则返回 0。

问题链接:209。最小子数组总和

一些例子:

nums = [2,3,1,2,4,3] target = 7 output = 2 
nums = [1,4,4] target = 4 output = 1 
nums = [1,1,1,1,1,1,1,1] target = 11 output = 0 

我的思考过程

class Solution(object):
    def minSubArrayLen(self, target, nums):
        i,j,sumSoFar=0,0,0
        N = len(nums)
        if N == 0:
            return 0
        min_len=float('inf')
        while j < N:
            if sumSoFar >= target:
                min_len = min(j-i, min_len)
                sumSoFar-=nums[i]
                i+=1
            else: #sumSoFar is less than target
                sumSoFar+=nums[j]
                j+=1
        if min_len == float('inf'):
            return 0
        return min_len

问题

在第一种情况下尝试手动解决时(

nums = [2,3,1,2,4,3]
target = 7
), 在我可以检查
j=6
作为可能的解决方案之前,我就到达了
[3,4]
,因为
j == N/6
。我也觉得 当我进入
if
条件时,我添加
nums[j]
两次(在
j=3
)。

我做错了什么?

python algorithm logic sliding-window
1个回答
0
投票

你的想法是好的,但是当j达到N时循环就会结束,这导致你无法找到nums末尾的子数组。

这是一个可行的解决方案:

from math import inf

def solution(nums, target):
    i=0
    j=0
    min_len = inf
    sumSoFar=0

    while j < len(nums) or sumSoFar >= target:
        if sumSoFar >= target:
            min_len = min(min_len, j - i)
            sumSoFar -= nums[i]
            i += 1
        else:  # sumSoFar is less than target
            sumSoFar += nums[j]
            j += 1
    return min_len if min_len != inf else 0

© www.soinside.com 2019 - 2024. All rights reserved.