LeetCode 0209.长度最小的子数组【Go】

简介: LeetCode 0209.长度最小的子数组【Go】

长度最小的子数组

LeetCode209. 长度最小的子数组

题目描述

给定一个含有n个正整数的数组和一个正整数target

找出该数组中满足其和≥ target的长度最小的连续子数组[numsl, numsl+1, ..., numsr-1, numsr],并返回其长度。如果不存在符合条件的子数组,返回 0

示例 1:

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

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

思路

题目要求

  • 给定一个数组和一个正整数,找到最小子数组的和给定的正整数
  • 返回最小子数组的长度,若不存在则返回0

暴力解法是写两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)

滑动窗口法:不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。定义一个左指针和一个右指针,右指针向前移动,直到找到子串和大于给定数停止移动,并记录子串长度。此时,左指针向前移动,找子串的最小长度并记录。当子串和小于给定数时,左指针停止移动,右指针开始向前移动,直到找到子串和大于给定数停止移动……这样可以将数组中所有可能性都计算一遍。时间复杂度是O(n)

滑动窗口法也可以理解为双指针法的一种,只不过这种解法更像是一个窗口的移动,所以叫做滑动窗口更适合一些。

注意

  • 左右指针的起始位置都置为-1,与后面先移动指针后累加的顺序保持一致
  • 为了与后面比较各子串长度,所以将最小子串初值置为数组长度+1,最后返回最小子串长度进行判断
  • 循环条件为左指针不超过右指针,当右指针移动后越界也结束循环

代码

Go

func minSubArrayLen(target int, nums []int) int {
  length := len(nums)
  leftIndex, rightIndex := -1, -1
  minSubLen := length + 1
  sum := 0
  for leftIndex <= rightIndex {
    if sum < target {
      rightIndex++
      if rightIndex > length-1 {
        break
      }
      sum += nums[rightIndex]
    } else {
      leftIndex++
      if rightIndex-leftIndex+1 < minSubLen {
        minSubLen = rightIndex - leftIndex + 1
      }
      sum -= nums[leftIndex]
    }
  }
  if minSubLen == length+1 {
    return 0
  } else {
    return minSubLen
  }
}

Link

GitHub

目录
相关文章
|
17天前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
10天前
|
人工智能
力扣100114. 元素和最小的山形三元组 II(中等)
力扣100114. 元素和最小的山形三元组 II(中等)
|
17天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
15 0
|
17天前
leetcode代码记录(长度最小的子数组
leetcode代码记录(长度最小的子数组
16 0
|
17天前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
17天前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
17天前
|
算法
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
LeetCode题:581. 最短无序连续子数组,242. 有效的字母异位词,202. 快乐数
32 0
|
17天前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
45 0
|
17天前
|
存储
【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针
我们可以使用双指针解决本题,定义两个指针 i 和 j 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和。每一轮迭代中,每当 sum >= target 则记录子数组最小长度,移动慢指针。在每一轮迭代最后,移动快指针
|
5天前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
13 2
【力扣刷题】两数求和、移动零、相交链表、反转链表