【LeetCode】最短子数组之和(Minimum size subarray sum)

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.

For example, given the array  [2,3,1,2,4,3] and  s = 7,
the subarray  [4,3] has the minimal length under the problem constraint.
【题目】
给定一个数组包含n个正整数,再给定一个整数s,找出最短长度的连续子数组,使该子数组的和sum满足sum≥s,如果不存在满足条件的情况则返回0。
例如:[2, 3, 1, 2, 4, 3]     7
输出:2
该输出对应的子数组为[4, 3]。

【思路】
两个指针,start和end。end向后走直到sum大于s。然后start向后,直到sum小于s。同时更新min值。

【Code】

public class MinimumSizeSubarraySum {
    public int minSubArrayLen(int s, int[] nums) {
        //两个数组索引
        int start = 0;
        int end = 0;

        int sum = 0;//计算子数组和
        int min = Integer.MAX_VALUE;//保存最小子数组长度

        while(start < nums.length && end < nums.length) {
            while(sum < s && end < nums.length) {
                sum += nums[end++];//相加直到和大于等于s
            }
            while(sum >= s && start <= end) {
                min = Math.min(min, end-start);//记录最短长度
                sum -= nums[start++];//sum减去子数组头,start前移
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值