Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

长度最小的子数组

力扣题号209

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
给定一个含有 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
暴力循环

首先还是最简单暴力的 双重循环for循环遍历,记录长度然后对比取最小值

循环大法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int subLen = 0;
int sum = 0;
for (int j = 0; j < nums.length; j++) {
sum = 0;
for (int i = j; i < nums.length; i++) {
sum = sum + nums[i];
if (sum >= target ){
subLen = i - j + 1;
result = subLen < result ? subLen : result;
break;
}
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
滑动窗口

首先上面的暴力循环是过不去力扣的编译的哈哈哈哈,因为时间超限制了,所以还得是滑动窗口。所谓的滑动窗口也算是双指针的一种,不断调节两个指针之间的间距,也就是不断地调节子数组的其实位置和终止位置,从而得到最小的子数组

滑动窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int result = Integer.MAX_VALUE;
int i = 0;
int subLen;
int sum = 0;
for (int j = 0; j < nums.length; j++) {
sum = sum + nums[j];
while (sum >= target) {
subLen = j - i + 1;
result = Math.min(subLen, result);
sum = sum - nums[i++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}

评论