CanTechLab

Can

Leetcode:209.长度最小的子数组

2024-05-15

Leetcode题目链接:209. 长度最小的子数组

题目描述:

给定一个含有 n 个正整数的数组和一个正整数 target找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr],并返回其长度如果不存在符合条件的子数组,返回0

题目示例:

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

解题思路:

双指针(滑动窗口)

  • 定义start作为区间起始位置,end作为区间终点位置,result为最终区间长度,初始化为INT_MAX

  • 循环累加数组元素,找到满足累加器sum >= target的情况,此时start记录区间起始位置,end记录区间结束位置

  • 为了找到长度最小的连续子数组,需要对当前找到的这个满足条件的区间进行进一步的缩小(但是还是要满足缩小后的区间大小大于等于target值)

  • 采用将区间开始位置start向后移动的方法进行区间缩减,直至找到满足条件的最小区间,记录其长度为result

  • 继续执行for循环,执行所有可能情况以确定最终的result值

  • 最后需要进行特殊判断,若result的初始值(即INT的最大值)未被修改,意味着不存在符合条件的子数组,需要返回0(这里使用三元运算符进行判断)

我的答案:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int start = 0,sum = 0,len = 0;
        int result = std::numeric_limits<int>::max();
        for(int end = 0; end < nums.size(); end++ ){
            sum += nums[end];
            while(sum >= target){
                len = end - start + 1;
                result = min(result, len);
                sum -= nums[start];
                start++;
            }
        }
        return result == std::numeric_limits<int>::max() ? 0 : result;
    }
};

提交结果:

官方答案:

//暴力法:通过两层for循环找出所有可能的区间结果,并在此过程中确定最小的区间长度
class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i; j < n; j++) {
                sum += nums[j];
                if (sum >= s) {
                    ans = min(ans, j - i + 1);
                    break;
                }
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/305704/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。