您现在的位置是:首页 >技术杂谈 >leetcode 209. 长度最小的子数组网站首页技术杂谈
leetcode 209. 长度最小的子数组
简介leetcode 209. 长度最小的子数组
题目描述:
给定一个含有 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
思路一:
看到这道题的描述,直接就想到了双指针,判断区间元素和是否大于等于target,如果满足条件,用res对其进行记录,同时左指针右移,重复操作,取最小res值即可
时间复杂度:O(n)
C++:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n=nums.size(),sum = 0,i=0,res=nums.size()+1;
for (int j=0;j<n;j++)
{
sum +=nums[j];
while (sum>=target)
{
sum -= nums[i];
res = min(res,j-i+1);//取连续元素之和大于target的最小长度
i+=1;
}
}
if (res>n)
{
return 0;
}
return res;
}
};
Python:
class Solution(object):
def minSubArrayLen(self, target, nums):
i,j=0,0
res=len(nums)+1
sum=0
for j in range(len(nums)):
sum+=nums[j]
while sum >= target:
sum-=nums[i]
res=min(res,j-i+1)
i+=1
if res > len(nums):
return 0
return res
思路二:
还有就是最原始的方法,“暴力法”,双重循环遍历数组,在所有可能出现的情况中,记录满足条件的情况,再比较出res的最小值,这种方法原理很好想,但是往往会因为复杂度过高而超出题目所给时间限制
(时间复杂度:O(n^2))
C++:
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n = nums.size(),ans=nums.size()+1;
if (n == 0) {
return 0;
}
for (int i = 0; i < n; i++) {
int sum = 0;
for (int j = i; j < n; j++) {
sum += nums[j];
if (sum >= s) {
ans = min(ans, j - i + 1);
break;
}
}
}
if (ans >n){
return 0;
}
return ans;
}
};
Python:
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
if not nums:
return 0
n = len(nums)
ans = n + 1
for i in range(n):
total = 0
for j in range(i, n):
total += nums[j]
if total >= s:
ans = min(ans, j - i + 1)
break
if ans == n + 1 :
return 0
else:
return ans
总结:
双指针的简单使用,熟练使用双指针很关键。
涉及知识:双指针
相关问题可在我的专栏中查看:
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。