题目
给定一个含有 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
C++代码
#include <iostream>
#include <vector>
using namespace std;
/*
* 滑动窗口方法解决长度最小的子数组问题
* 使用start,end两个指针,找到以每个元素开始>=target的数组
*/
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
int ans = INT_MAX;
int start = 0, end = 0;
int sum = 0;
while (end < n) {
sum += nums[end];
while (sum >= target) {
ans = min(ans, end - start + 1);
sum -= nums[start];
++start;
}
++end;
}
return ans == INT_MAX ? 0 : ans;
}
int main() {
int target = 7;
vector<int> nums = { 2,3,1,2,4,3 };
int min = minSubArrayLen(target, nums);
cout << "The min arraylen: " << min << endl;
return 0;
}
分析
滑动窗口方法解决长度最小的子数组问题,使用 start, end 两个指针,找到以每个元素开始 >= target 的数组。
问题
C++中 INT_MAX 表示最大整数(整型上限),INT_MAX = 2^31-1。