Leetcode 209. 长度最小的子数组

class Solution 
{
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
        int i=0,j=0,sum=0;
        int len = INT_MAX;
        for(;j<nums.size();j++)
        {
            sum+=nums[j];
            while(sum>=target)
            {
                len=min(len,j-i+1);
                sum-=nums[i++];
            }
        }
        return len==INT_MAX?0:len;
    }
};

题目描述的缩写:给你一个数组nums[],给你一个值target,你要做的是找一个数组,这个数组的和要大于等于target,返回的是数组的长度值,当然了,此题要的是最小值。

想法:一般的话就是暴力解决了,但是我们可以优化它,比如j走到一个位置,如果此时数组刚好都符合要求了(即:总和都大于等于target了),那么j就没必要往后走了(切记我们要的是len的最小值),即以现在的i开头的这些个大大小小的数组之和中满足要求的最小值已经被我们找到了,下一步你就换一个开头接着找人家要小的长度就行了;

另外一个就是j如果此时所在位置满足要求了,那么你如果让i++,然后j又退回去这个i++的位置的话,那又多走几步,因为j就是刚跨越target的那个数组的右端点,你j还往回退,那肯定没有答案,如果有,那就是j这个位置的那个值足够大,以至于让i++后也可以大于等于target,所以,你就让j呆在原地,让i++,看此时求和是否大于等于target,不满足那就j++,满足那就说明j这里的这个值确实挺大的,更新我们的答案即可,然后接着让i++,有人可能问了,为啥要i++呢,别忘了刚说的,你难道又要j++,然后去找那些距离要求越来越远的值吗?显然不是!因为以现在的i开头的这些个大大小小的数组之和中满足要求的最小值已经被我们找到了!所以i++之后接着判断就好了,如果不满足要求,j++即可。需要注意的是此时每次sum就是要sum本身减去i刚刚那个位置的值。即sum=sum-nums[i];不用从左往右加了。

还有需要注意的一点就是最后return这一下,如果直接return len;那么就错了,因为有的样例是找不到最小的那个数组的,应该返回零,但是你返回了INT_MAX,那么怎么办呢?就需要你最后这一下对于len判断一下,如果还是INT_MAX的话,那说明len=0;

【注】:子串、子数组这两个概念都意味着连续,就是它们在原数组/串中是一个挨着一个的;

与之对应的是子序列,不一定需要连续,只要相对顺序和原数组/串一样就行了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值