1.题目描述
2.解题思路
2.1理解题意
2.2解决方法
2.3完整代码
3.小节
1.题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
2.解题思路:
2.1理解题意:
从题目中我们可以知道两点:
1.需要判断数组中任意几个连续值和的大小是否大于等于目标值,最终将他们看成为很多个新的子数组;
2.找出这些子数组中长度最小的数组
3.如果不满足1的话说明不存在符合条件的子数组
2.2解决方法:
1.定义两个指针,left和right
left为数组最左侧的边界(也是起始索引):为0
right为数组最左侧的边界(也是起始索引):遍历原数组时,我们将该数组的索引定义为right:初始索引为0
2.right的值每增加一次,我们就将区间[left,right]中获取到的值看成一个新的小数组,并对里面的值求和,并判断该值是否大于等于目标值
3.当数组中right位置所对应的求和大于目标值时,我们就获取数组的长度,第一次获取到数组的长度后需要与result(默认为最大值Integer.MAX_VALUE)进行比较,并获取两者中长度小的值为属性result赋值,以后每一次获取到数组的长度后需要与result进行比较,并获取两者中长度小的值为属性result赋值;然后移动left指针(进行加一操作),我们就将区间[left,right]中获取到的值也看成一个新的小数组,并对里面的值求和(即用2处求和的值减去此处left之前的所有值),继续判断该值是否大于等于目标值;当区间[left,right]中所有元素的求和小于目标值时,left不再移动
4.继续上述2,3逻辑
5.最后判断result的值:如果是Integer.MAX_VALUE,说明不存在符合条件的子数组,返回 0;如果不是Integer.MAX_VALUE,说明存在符合条件的子数组,返回 result即可
2.3完整代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int left = 0;
int result = Integer.MAX_VALUE;
int sum = 0;
for(int right = 0;right < nums.length;right++){
sum += nums[right];
while(sum>=target){
int lengthM = right - left + 1;
result = result>lengthM?lengthM:result;
sum -= nums[left++];
}
}
return result == Integer.MAX_VALUE?0:result;
}
}
3.小节:
著此篇,与君享,互勉之,共进步!