这题想暴力解决不难。 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。
如:
class Solution {
public:
// 函数用于查找连续子数组的最小长度,其和大于或等于给定的目标值。
int minSubArrayLen(int target, vector<int>& nums) {
// 将结果初始化为正无穷大。
int result = INT_MAX;
// 遍历数组中的每个索引。
for (int i = 0; i < nums.size(); i++) {
// 初始化当前子数组的和。
int sum = 0;
// 从当前索引迭代到数组的末尾。
for (int j = i; j < nums.size(); j++) {
// 累加当前元素到子数组和中。
sum += nums[j];
// 如果子数组和大于或等于目标值,则更新结果为当前子数组的长度。
if (sum >= target) {
result = min(result, j - i + 1);
break;
}
}
}
// 如果结果不是正无穷大,则返回结果;否则返回 0。
if (result != INT_MAX)
return result;
else
return 0;
}
};
但是如何用时间复杂度更低的方法呢???
很简单,与暴力方法的代码区别也不大。用滑动窗口,终端j每次不回到i。
class Solution {
public:
// 求解最小长度子数组的函数
int minSubArrayLen(int target, vector<int>& nums) {
// 初始化结果为整型最大值
int result = INT_MAX;
// 初始化两个指针 i 和 j,分别表示子数组的起始和结束位置
int i, j;
// 初始化当前子数组的和为第一个元素的值
int sum = nums[0];
// 循环遍历数组
for (i = 0, j = 0; i < nums.size() && j < nums.size();) {
// 如果当前子数组的和大于等于目标值
if (sum >= target) {
// 更新结果为当前子数组的长度与之前结果的较小值
result = min(result, j - i + 1);
// 减去子数组起始位置的元素,并将起始位置指针向右移动
sum -= nums[i];
i++;
} else {
// 如果还有元素可以添加到子数组中
if (j != nums.size() - 1) {
// 将结束位置指针向右移动,并加上新的元素到当前子数组中
j++;
sum += nums[j];
} else {
// 如果已经到达数组末尾,则退出循环
break;
}
}
}
// 如果结果被更新过,返回最小长度;否则返回0
if (result != INT_MAX)
return result;
else
return 0;
}
};