力扣209题——通过滑动窗口的方法来获取长度最小的子数组

1.题目描述
2.解题思路
2.1理解题意
2.2解决方法
2.3完整代码
3.小节

1.题目描述:

力扣209题

给定一个含有 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.小节:

著此篇,与君享,互勉之,共进步!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值