算法——长度最小的子数组(leetcode209)
首先题目明确给出一个含有n个正整数的数组和一个目标值我们需要求出数组中下标连续的子数组元素之和大于等于目标值的最小子数组并返回。
明确题目大意后我们最容易想到的还是用两层for循环(外层for循环确定子数组的起始位置,内层for循环来确定终止位置并枚举起始位置至终止位置的数组的各种子数组的情况)然后筛选出符合题意的长度最小子数组并返回这种解法虽然思路较为简单但时间复杂度较高如果想要进一步优化时间复杂度的话我们可以使用滑动窗口的思想也就是双指针解法
双指针我们只需要使用一层for循环即可但要明确for循环中自增变量j的含义如果我们将j表示为起始位置的话那么求长度最小的子数组还是要遍历后续元素实质上和双层for循环是相似的所以我们将j定义为终止位置的指针,i表示起始位置的指针如果i至j这个子数组区间内的元素和大于等于目标值那么起始位置指针+1向右移动同时取符合条件的最小子数组的长度如此当for循环结束之后我们就可以得到长度最小的子数组长度并返回
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int sum=0;
int result=Integer.MAX_VALUE;
int i=0;
for (int j = 0; j < nums.length; j++) {
sum+=nums[j];
while(sum>=target){
if(result>j-i+1){
result=j-i+1;
}
sum-=nums[i];
i++;
}
}
return result==Integer.MAX_VALUE?0:result;
}
}