力扣209. 长度最小的子数组

104 阅读1分钟

209. 长度最小的子数组

image.png

解题思路1

本题采用双for循环,遍历所有情况

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int result = INT32_MAX;//result为最后的结果,先给result赋一个最大的数
        int mid = 0;//初始化子序列的长度
        for(int i = 0; i<nums.size(); i++)
        {
            sum = 0;
            for(int j=i;j<nums.size(); j++)
            {
                sum += nums[j];//从第i个数开始,逐次加上i后的数
                if(sum >= target)//当所加数的和大于目标值时
                {
                    mid = j - i + 1;//得出当前子序列长度
                    if(mid < result)
                    {
                        result = mid;
                    }
                    break;//得到result的值,退出内部循环
                }
            }
          
        }
        return result == INT32_MAX ? 0:result;//若result没有被赋值,即所加数的和从未大于等于目标值,返回0
    }
}; 

解题思路2

采用滑动窗口法。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        int result = INT32_MAX;
        int i = 0;//i为滑动窗口起始位置
        int mid = 0;
        for (int j=0; j<nums.size(); j++)
        {
            sum += nums[j];
            while(sum >= target)
            {
                mid = (j - i + 1);//当前子序列的长度
                result = result > mid ? mid : result;
                sum = sum - nums[i];//减去窗口起始位置的值
                i++;//窗口起始位置向后移一位
            }


        }
        return result == INT32_MAX ? 0 :result;



    }
};