给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
自己的思路
使用双指针, 快指针进行遍历, 定义一个sum存储fast遍历过的元素的和, 当sum < target时 就++fast, sum += num[fast], 再与target进行比较, 如果sum >= taget , 说明slow 到 fast的是满足条件的连续子数组, 但不一定长度最小。 定义一个ans 记录此时子数组的长度。 此时应该 ++slow 而不是++fast, 因为++fast后的数组一定比当前数组长。当然++slow前应该 sum -= num[slow], 这是为了看去掉slow元素后的子数组是否还满足条件, 若满足 则删除slow处元素的数组更短。 如果不满足 继续++fast, 重复上述过程, 直到遍历结束。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int ans = INT32_MAX;
int slow = 0, fast = -1;
while (fast != nums.size())
{
if (nums[0] >= target)
return 1;
if (sum >= target)
{
if (fast - slow + 1 < ans)
{
ans = fast - slow + 1;
}
sum -= nums[slow];
++slow;
}
else
{
++fast;
if (fast == nums.size())
break;
sum += nums[fast];
}
}
return ans == INT32_MAX ? 0 : ans;
}
};
优化下代码
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int sum = 0;
int ans = INT32_MAX;
int slow = 0, fast = 0;
while (fast != nums.size())
{
if (nums[0] >= target)
return 1;
sum += nums[fast];
while (sum >= target)
{
ans = fast - slow + 1 < ans ? fast - slow + 1 : ans;
sum -= nums[slow];
++slow;
}
++fast;
}
return ans == INT32_MAX ? 0 : ans;
}
};