做题记录 力扣 209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
很简单,用双指针。
主要思路:
最开始都初始化,指向第一个元素。
遵循以下规则:
步骤一:慢指针不动,快指针往后移动,并不断判断是否大于等于 target。如果大于或者等于,进入步骤二,否则判断是否到达数组最后一位。如果到达,直接结束循环。否则,继续步骤一。
步骤二:慢指针++,并减去之前慢指针的值,并判断和是否大于等于 target,如果大于或者等于,重复步骤二,否则进入步骤一。
一直到 慢指针 到达最后一位就行。
这里个人认为最难处理的是边界值,算法的思路还是比较任意理解的。
代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int last = 0;
int sum = nums[0];
int result = Integer.MAX_VALUE;
while (last < nums.length-1) {
if (sum < target) {
if (start == nums.length-1) break;
else if (start < nums.length-1) {
start++;
sum += nums[start];
}
} else {
int temp = start- last +1;
result = result > temp ? temp :result;
sum -= nums[last];
last++;
}
}
if (target <= nums[nums.length-1]) {
result = result > 1 ? 1 :result;
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}