类似于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; } };