题目
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
解题
用暴力遍历也是可以解决的,但是python语言在leetcode上会超时
方法一:双指针(滑动窗口)
python解法
class Solution: def minSubArrayLen(self, s: int, nums: List[int]) -> int: n = len(nums) fast = 0 slow = 0 ans = n+1 tmp = 0 while fast<n: tmp+=nums[fast] while tmp>=s: ans = min(ans,fast-slow+1)#由于前面nums[fast]加上了,但是fast还没+1,所以这里要补个1 tmp-=nums[slow] slow+=1 fast+=1 return 0 if ans==n+1 else ans
c++解法
class Solution { public: int minSubArrayLen(int target, vector<int>& nums) { int n = nums.size(); int slow=0,fast=0; int res=INT_MAX; int tmp=0; while(fast<n){ tmp+=nums[fast]; while(tmp>=target){ res = min(res,fast-slow+1); tmp-=nums[slow]; slow++; } fast++; } return res==INT_MAX?0:res; } };
java解法
class Solution { public int minSubArrayLen(int target, int[] nums) { int n=nums.length; int slow=0,fast=0; int res=n+1; int cur=0; while(fast<n){ cur+=nums[fast]; while(cur>=target){ res=Math.min(res,fast-slow+1); cur-=nums[slow]; slow++; } fast++; } return res==n+1?0:res; } }