LeetCode | Minimum Size Subarray Sum

100 篇文章 0 订阅
6 篇文章 0 订阅

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.

click to show more practice.

More practice:

If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

还差一点没有想清楚,如何控制循环使得整个思路可以正常进行。

所想是start和end指针,当前比s小则继续往后取,比s大则需要更新minV,并且删除start之处元素。

而仅仅用if不能得到这样的判断,它会导致反复进入else子句,导致RE

<span style="white-space:pre">	</span>int start=0,end=0,sum=0,minV=INT_MAX;
        while(start<n){
            if(sum>=s){
                minV=min(minV,end-start);//计算最小值
                sum-=nums[start++];//去掉第一个数据,重新开始计数
            }
            else{
                sum+=nums[end++];//计算总量
                if(end==n && sum<s && minV==INT_MAX) return 0;
            }
        }
正确的方法是应用两个while循环

当获取到足够的数或者到达数组边界的时候,再对sum进行判断。

并且是循环到这个数据比s小。

这样就足以保证进入end++子句的判断中的时候,sum<s,进入start++子句的时候,sum>=s

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n=nums.size();
        int start=0,end=0,sum=0,minV=INT_MAX;
        while(start<n && end<n){
            while(sum<s && end<n)
                sum+=nums[end++];//计算总量
            while(sum>=s && start<=end){
                minV=min(minV,end-start);//计算最小值
                sum-=nums[start++];//去掉第一个数据,重新开始计数
            }
        }
        return minV==INT_MAX?0:minV;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值