网站页脚内容,个人网站设计制作步骤,学校网站需求,淘宝网站建设的目标题目链接#xff1a;leetcode 209
1.题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] #xff0c;并返回其长度。如果不存在符合条件的子数组#xff0c…题目链接leetcode 209
1.题目
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] 并返回其长度。如果不存在符合条件的子数组返回 0 。
2.示例
1示例 1 输入target 7, nums [2,3,1,2,4,3] 输出2 解释子数组 [4,3] 是该条件下的长度最小的子数组。
2示例 2 输入target 4, nums [1,4,4] 输出1
3示例 3 输入target 11, nums [1,1,1,1,1,1,1,1] 输出0
4数据范围 1 target 109 1 nums.length 105 1 nums[i] 105
3.分析
首先使用前缀和数组进行记录对于固定区间某个右端点st2,当sum[st2]-sum[st1]target时说明区间长度可以缩小st1,当sum[st2]-sum[st1]target说明区间长度需要增加才能满足要求st1同时对于大于上一时刻st2_last的st2_now,st1_last已经是满足sum[st2]-sum[st1]target的最大st1了st1之前的不需要遍历时间复杂度为O(n)
4.代码
class Solution {
public:int minSubArrayLen(int target, vectorint nums) {//O(n)int sum[100010];for(int i0;inums.size();i)sum[i1]sum[i]nums[i];int st10,st21,ansnums.size();if(sum[nums.size()]target) return 0;while(st1st2st2nums.size()){while(sum[st2]-sum[st1]targetst11st2)st1;while(sum[st2]-sum[st1]targetst1-10)st1--;if(sum[st2]-sum[st1]target)ansmin(ans,st2-st1);st2;}return ans;}
};