暴力枚举
使用双层循环,一层确定起始位置,一层确定终止位置,相加,当大于target时候,就返回长度,因为双层循环,时间复杂度 o(n^2):
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len=0;
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target ||nums[i]==target)
{
len=j-i+1;
}
else
{
len=0;
}
}
}
return len;
}
};
修改
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int len = 0;
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) {
len = (len == 0) ? j - i + 1 : min(len, j - i + 1);
break;
}
}
}
return len;
}
};
len = (len == 0) ? j - i + 1 : min(len, j - i + 1);
这行代码是一个三元运算符,它的意思是如果 len 等于0,则将 len 赋值为当前找到的子数组长度 j-i+1,否则将 len 更新为当前找到的子数组长度和 len 中的较小值。这样可以确保 len 始终存储最小的满足条件的子数组长度。
具体来说,当第一次找到满足条件的子数组时,len 的值为0,此时将其赋值为当前找到的子数组长度 j-i+1。后续如果找到了更小的子数组,则将 len 更新为更小的值。
滑动窗口
单层循环遍历,时间复杂度o(n).
拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili
leetCode 209题 [数组] 长度最小的子数组 滑动窗口解法思路_哔哩哔哩_bilibili
LeetCode209:长度最小的子数组(滑动窗口)_哔哩哔哩_bilibili