力扣209长度最小的子数组-java

题目描述
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

做法:双指针-滑动窗口

什么是滑动窗口?
不断的调节子序列的起始位置和终止位置,进而得出想要的结果。

算法步骤

第一步:right向右移增加窗口,直到窗口内的数字和大于等于S
第二步:记录这个时候的长度,left向右移动,开始减少长度,每减少一次,就更新最小长度,直到窗口内的数小于s

举个栗子
在这里插入图片描述
这个时候窗口内所有数字的和只有 2 这个数字,2 小于 7 ,rigth 右移。
在这里插入图片描述
这个时候窗口内的数字是 2 3,2 +3 = 5 小于 7 ,rigth 右移
在这里插入图片描述
这个时候窗口内的数字是 2 3 1 ,2 +3 +1= 6 小于 7 ,rigth 右移
在这里插入图片描述
这个时候窗口内的数字是 2 3 1 2 ,2 +3 +1+2= 8 大于 7 ,记录这个时候的长度 min = 4,left 右移
在这里插入图片描述
这个时候窗口内的数字是 3 1 2 ,3 +1+2= 6 小于 7 ,rigth 右移
在这里插入图片描述
这个时候窗口内的数字是 3 1 2 4 ,3 +1+2+4= 10 大于 7 , 更新长度 min = 4,left 右移
在这里插入图片描述
这个时候窗口内的数字是 1 2 4 ,1+2 +4= 7 等于 7 更新长度 min = 3,left 右移
在这里插入图片描述
这个时候窗口内的数字是 2 4 ,2 + 4= 6 小于 7 ,rigth 右移
在这里插入图片描述
这个时候窗口内的数字是 2 4 3,2 +4 + 3= 9 大于 7 更新长度 min = 3,left 右移
在这里插入图片描述
这个时候窗口内的数字是 4 3,4 + 3= 7 等于 7 更新长度 min = 2,left 右移
在这里插入图片描述
这个时候窗口内的数字是 3, 3 小于 7,rigth右移这个循环结束

class Solution {
   public int minSubArrayLen(int s, int[] nums) {
  
    if(nums == null || nums.length == 0) return 0;
        int left = 0;//左指针
        int right = 0;//右指针
        int sum = 0;//滑动窗口数值的和
        int min = Integer.MAX_VALUE;
        //滑动窗口的长度,这里的 Integer.MAX_VALUE;是Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
        while (right < nums.length) {
            sum += nums[right];//计算滑动窗口内数字的和
            right++;
            //每次更新起始位置,并不断比较子序列是否符合条件
            while (sum >= s) {
                min = Math.min(min, right - left);//取子序列的长度
                sum -= nums[left];//这里体现了滑动窗口的精髓之处,不断的变更
                left++;
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
        //三元表达式,如果没有符合条件的子序列返回0,否则就是找到了子序列,返回长度
        }   
}

参考:
https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247484315&idx=1&sn=414b885abba34abfd8d9f35c9f61b857&scene=21#wechat_redirect

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值