给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
题目的重点在于连续子数组,基于此使用的算法是滑动窗口
输入为一个整数t和一个数组nums
第一步,定义变量,n为数组长度,minlength为子序列的最小长度初始化需要用一个很大的值,这里可以使用std::numeric_limits<int>::max()方法取得int的最大值,整数left为数组左指针初始化为0,整数sum,窗口内值的和
第二步,定义for循环,初始化窗口右指针right为0,条件为right<n,每次循环后right++
第三步,sum+=nums[right]将窗口右值加入窗口
第四步,定义while循环,当sum值大于等于t时执行下列操作
更新minlength,更新使用std::min()方法进行判断(minlength 和 新窗口长度right-left+1)
sum+=nums[left],将新窗口左值删除
left++
for循环执行完毕后,判断minlength是否为初始值,若是,输出为0,若不是输出minlength
流程图为
class Solution {
public:
int minSubArrayLen(int target, std::vector<int>& nums) {
int n = nums.size();
int minLength = std::numeric_limits<int>::max(); // 使用一个很大的数开始,用于寻找最小长度
int left = 0; // 滑动窗口的左端点
int sum = 0; // 窗口内的数值和
for (int right = 0; right < n; right++) {
sum += nums[right]; // 将当前元素加入窗口
// 当窗口内的和大于等于目标值时,尝试缩小窗口以寻找更小的满足条件的窗口
while (sum >= target) {
minLength = std::min(minLength, right - left + 1); // 更新最小长度
sum -= nums[left]; // 移除窗口左端的元素
left++; // 窗口左端向右移动
}
}
return (minLength == std::numeric_limits<int>::max()) ? 0 : minLength; // 如果没有找到合适的窗口,返回0
}
};