剑指 Offer II 008. 和大于等于 target 的最短子数组
原文链接:https://blog.csdn.net/qq_39355828/article/details/120427449 (opens new window) 剑指 Offer II 008. 和大于等于 target 的最短子数组
给定一个含有 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
使用滑动窗口模板:
(1)初始化left=0
(2) 初始化返回值=最大值或者最小值
(3)for 左边界 in 可以迭代的对象:
更新窗口内部信息
while(与题目条件相比较):
比较更新ret值,并且窗口收缩或者扩张
返回ret
# 代码
public int minSubArrayLen(int target, int[] nums) {
//Arrays.sort(nums);
//左右窗口进行初始化
int left=0;
int total=0;
int ret=Integer.MAX_VALUE;
//右窗口进行扩张
for(int right=0;right<nums.length;right++)
{ //计算从0到right的元素总和
total=total+nums[right];
//
//比较目标值,进行窗口调整
while(total>=target)
{
ret=Math.min(ret,right-left+1);
total=total-nums[left++];
}
}
return ret>nums.length?0:ret;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
编辑 (opens new window)
上次更新: 2026/08/11, 13:36:18