代码随想录 209. 长度最小的子数组 滑动窗口

205 阅读1分钟

209. 长度最小的子数组 - 力扣(LeetCode)

暴力枚举

使用双层循环,一层确定起始位置,一层确定终止位置,相加,当大于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 更新为更小的值。 image.png

滑动窗口

单层循环遍历,时间复杂度o(n).

拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

leetCode 209题 [数组] 长度最小的子数组 滑动窗口解法思路_哔哩哔哩_bilibili

LeetCode209:长度最小的子数组(滑动窗口)_哔哩哔哩_bilibili

image.png

image.png