落花人独立
微雨燕双飞
双指针,也可以说是滑动窗口。
双指针比较难理解的地方在于,怎么确定这两个下标移动的时候不会漏掉可能最优的情况。
一般来说对于有序数组,我们要找到某个和,可以用双指针中的左右指针。同样这次也是要找某个满足条件的和,所以首先就是要构造前缀和数组,这样直接就能根据差确定某段连续元素的和。
然后就是用双指针维护一个最小的窗口,如果前缀和的差小于S,则需要扩大窗口,右移right。
如果前缀和的差大于等于S,则需要缩小窗口,右移left。
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int len = nums.size();
vector<int> presum(len + 1, 0);
for (int i = 1; i <= len; i++) presum[i] = presum[i - 1] + nums[i - 1];
int left = 0, right = 1;
int ans = INT_MAX;
while (right <= len) {
if (presum[right] - presum[left] >= s) {
ans = min(ans, right - left);
left++;
} else right++;
}
return ans == INT_MAX ? 0 : ans;
}
};