209.长度最小的子数组
给定一个含有 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
题目来源:力扣(LeetCode)
滑动窗口思路
能否写出:能写出。
时间:20多分钟
思路:
- 初始化结果变量
result
为数组长度加一,表示尚未找到满足条件的子数组。 - 初始化两个指针
i
和j
,分别表示子数组的起始和结束位置。 - 使用一个循环遍历数组,不断向右移动指针
j
,并累加子数组的和total
。 - 当
total
大于等于目标值时,进入内层循环。 - 在内层循环中,更新结果变量
result
为当前子数组长度和之前的结果变量中的较小值。 - 减去指针
i
所指向的元素,并将指针i
右移一位,缩小子数组的范围。 - 重复步骤 5 和步骤 6,直到
total
不再大于等于目标值。 - 返回最终的结果
result
,如果result
仍然为数组长度加一,则说明未找到满足条件的子数组,返回 0。
// 仅是我的思路代码,leetcode上大神更厉害 class Solution { public int minSubArrayLen(int target, int[] nums) { int result = nums.length + 1; int total = 0; int i = 0; int j = 0; while (j < nums.length) { total = total + nums[j]; j++; while (total >= target) { result = Math.min(result, j - i); total = total - nums[i]; i++; } } return result == nums.length + 1 ? 0 : result; } }
时间复杂度: O(n)
空间复杂度:O(1)