【LeetCode每日一题】2020.6.28 209. 长度最小的子数组

209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。

示例:

输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。

分析:

​ 长度最小、连续、子数组,根据这些关键字,我们可以大概猜测出本题可以用 滑动窗口来解决。

滑动窗口:

​ 滑动窗口可以说是LeetCode的一个非常重要的算法模板,这里给出基本概念的Python代码:

right, left = 0, length - 1
while right < length:
    # 窗口扩大
    # ...
    right++
    # 窗口缩小
    # ...
    left++

​ 首先定义数组(或类数组,即可迭代或数字下标索引的)的双指针,作为滑动窗口的两端。

  • 定义外部变量存储答案(最小值或最大值)
  • 循环遍历,跳出条件为:right > length
    • 不断地扩大滑动窗口,right++,直到满足题目的特定要求
    • 缩小窗口,right++,直到不再满足该条件
    • 更新答案

代码(Golang):

func minSubArrayLen(s int, nums []int) int {
	curSum := 0
	n := len(nums)
	ans := n + 1
	left, right := 0, 0
	for right < n {
		curSum += nums[right]
		right++
		for curSum >= s {
			if right - left < ans {
				ans = right - left
			}
			curSum -= nums[left]
			left++
		}
	}
	if ans == n + 1 {
		return 0
	} else {
		return ans
	}
}

猜你喜欢

转载自www.cnblogs.com/enmac/p/13210901.html