zoukankan      html  css  js  c++  java
  • 【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
    	}
    }
    
  • 相关阅读:
    Java开发环境安装,环境变量
    Java开发环境
    命令提示符
    字节
    进制之间的转换
    Java背景
    项目中如何实现分页
    集合实战
    程序优化--降低复杂度
    消息队列 ---常用的 MQ 中间件
  • 原文地址:https://www.cnblogs.com/enmac/p/13210901.html
Copyright © 2011-2022 走看看