LeetCode 209 Minimum Size Subarray Sum 滑动窗口 & 二分答案
Given an array of positive integers nums
and a positive integer target
, return the minimal length of a contiguous subarray [numsl, numsl+1, ..., numsr-1, numsr]
of which the sum is greater than or equal to target
. If there is no such subarray, return 0
instead.
Solution
求最小的序列长度满足区间和 .
1.
和上一道题类似,利用滑动窗口的思想。我们用 记录当前的 ,如果满足 , 就不断缩短左端点 , 然后更新答案。
点击查看代码
class Solution { private: int ans = INT_MAX; public: int minSubArrayLen(int target, vector<int>& nums) { int n = nums.size(); int l=0,r=0; int cur=0; while(r<n){ cur+=nums[r]; while(cur>=target){ ans=min(ans,r-l+1); cur-=nums[l];l++; } r++; } return ((ans==INT_MAX)?0:ans); } };
2.
考虑前缀和 :
我们从后往前遍历,然后利用 来求出 满足:
改写一下得到:
除此以外,我们还有:
因此 是区间答案。
点击查看代码
class Solution { private: int ans = INT_MAX; public: int minSubArrayLen(int target, vector<int>& nums) { int n = nums.size(); vector<int> sum(n+1,0); for(int i=0;i<n;i++){ sum[i+1] = sum[i]+nums[i]; } // find a j : sum[j] > sum[i]-s // ---> sum[i]-sum[j]<s && sum[i]-sum[j-1]>=s // therefore: minimum length: i-j+1 for(int i=n;i>=1;i--){ if(sum[i]>=target){ int j = upper_bound(sum.begin(),sum.end(),sum[i]-target)-sum.begin(); ans=min(ans,i-j+1); } } return ((ans==INT_MAX)?0:ans); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】