**Leetcode 209. Minimum Size Subarray Sum | 区间和符合条件 >= k

https://leetcode.com/problems/minimum-size-subarray-sum/description/

O(n)可解

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if (nums.size()==0 || s == 0) return 0;
        int cur = nums[0], left = 0, right = 0;
        int ret = nums.size() + 1;
        
        while (right < nums.size()){
            if (cur >= s) {
                ret = min(ret, right - left + 1);
                cur -= nums[left];
                left++;
            } else {
                right ++;
                cur += nums[right]; 
            }
        }        
        
        return ret == nums.size() + 1 ? 0 : ret;
    }
};

另外拿这个题当二分联系了,二分长度

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int cur = 0, left = 0,   l = 0, r = nums.size(), get = 0;
        
        for (int i = 0; i < nums.size(); i++) 
            cur += nums[i];
        if (cur<s) return 0;
        while (l < r) {
            int mid ;
            mid =l + ((r - l )>>1);
            bool check = false;
            for (left=0; left + mid -1 < nums.size(); left++) {
                if (left == 0) {
                    cur = 0;
                    for (int i = left; i < left + mid; i++) {
                        cur += nums[i];
                    }
                } else {
                    cur -= nums[left-1];
                    cur += nums[left + mid -1];
                }
                
                
                if (cur >= s) {
                    check = true;
                    get = 1;
                    break;
                } 
            }
            
            if (check) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        if (get) return r; 
        else return nums.size();
    }
};

这个可以作为模板,注意点就是 r=mid这种写法,当长度为1的时候,必须是做端点,对应上面mid的写法。

为了防止死循环,每次代入l=2 r=3检查一次


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值