209.长度最小的子数组

解题思路

本来的思路是双指针,左右指针找到目标范围后,左指针向右移动。
后来看到了滑动窗口这个概念,这样就可以节约一下不必要的重复了。

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。 ——《代码随想录》

出现的问题

在计算当前窗口长度的时候,要注意是(终点指针的index - 起点指针的index + 1)。

JavaScript解法代码

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let results = nums.length + 1
    let sum = 0
    let i = 0
    for (let j = 0; j < nums.length; j++) {
        sum += nums[j]
        while (sum >= target) {
            results = Math.min(results, j-i+1)
            sum -= nums[i]
            i++         
        }
    }
    if (results == nums.length + 1) {
        return 0
    } else {
        return results
    }
};

Python解法代码

class Solution(object):
    def minSubArrayLen(self, target, nums):
        """
        :type target: int
        :type nums: List[int]
        :rtype: int
        """
        result = len(nums)+1
        sum = 0
        start = 0
        for j in range(len(nums)):
            sum += nums[j]
            while sum >= target:
                    result = min([result,j-start+1])
                    sum -= nums[start]
                    start+=1
        if result <= len(nums):
            return result
        else:
            return 0

总结:

  1. 滑动窗口其实是双指针问题的简化版,它只有一个for循环,j代表的是终止位置。
  2. 滑动窗口解题思路就是:
  1. 初始化所要用到的值:start index,窗口长度,窗口内值之和(按题目要求)
  2. for循环,使用终止指针来计算;其中用一个while 来保证持续判断
  3. 返回结果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值