[leetcode题后感]Minimum Size Subarray Sum

类似于2sum 用两个指针指向一个subarray

当前subarray的和大于等于目标值时 记录一下当前子序列的长度 若他是最小值则更新最小值 然后讲第一个指针++ 

当子序列的和小于目标值的时候 第二个指针++

依次循环以上过程 直到第二指针走到队尾 或者 当第一个指针大于第二个指针的时候(即数组中出现了一个数字大于目标值) 此时直接返回1即可

要注意集中特殊测试用例

一种是第一个数字就比目标值大的情况

一种是遍历整个数组的和相加都小于目标值的情况

此题为新加入leetcode中的题 

标签中还有一个为二分查找 

这个二分查找的复杂度为nlgn 应该是n方算法的一个优化

具体算法为(转自http://www.cnblogs.com/grandyang/p/4501934.html)

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int len = nums.size(), sums[len + 1] = {0}, res = len + 1;
        for (int i = 1; i < len + 1; ++i) sums[i] = sums[i - 1] + nums[i - 1];
        for (int i = 0; i < len + 1; ++i) {
            int right = searchRight(i + 1, len, sums[i] + s, sums);
            if (right == len + 1) break;
            if (res > right - i) res = right - i;
        }
        return res == len + 1 ? 0 : res;
    }
    int searchRight(int left, int right, int key, int sums[]) {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (sums[mid] >= key) right = mid - 1;
            else left = mid + 1;
        }
        return left;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值