剑指 Offer II 008. 和大于等于 target 的最短子数组(双指针)

题目描述

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/2VG8Kg
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例1

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

示例2

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思路

该题中数组为正整数,又是求连续子数组,可以想到采用双指针思路。初始时,指针p1和p2指向下标0,若p1和p2之间的子数组之和小于target,则让p2向右移动直到子数组之和大于等于target。若子数组之和符合题意,则让指针p1向右移动直到子数组之和小于target,以此类推。
简单来说:这个过程就是右指针枚举,左指针贪心(或许不太准确,就是以局部最优推出全局最优)

代码

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        if(nums[0]>=target)return 1;
        int result=Integer.MAX_VALUE;
        int p1=0;
        int p2=0;
        int sum=0;
        for(;p2<nums.length;p2++){
            sum+=nums[p2];
            while(sum>=target && p1<=p2){
                result=Math.min(result,p2-p1+1);
                sum-=nums[p1];
                p1++;
            }           
        }
        return result==Integer.MAX_VALUE?0:result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值