单片机攻城之LeetCode刷题-209.长度最小的子数组

今天刷的LeetCode编程题目是209.长度最小的子数组,以下是学习笔记:

用滑动窗口来解,滑动窗口是一个解题模板,LeetCode许多题都可以用此模板来解。

滑动窗口:
定义两个指针 start 和end 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量sum 存储子数组中的元素和(即从 nums[start] 到nums[end] 的元素和)。

初始状态下,start 和 end 都指向下标 0,sum 的值为 0。

每一轮迭代,将 nums[end] 加到 sum,如果sum≥s,则更新子数组的最小长度(此时子数组的长度是 end−start+1),然后将nums[start] 从sum 中减去并将 start 右移,直到 sum<s,在此过程中同样更新子数组的最小长度。在每一轮迭代的最后,将end 右移。

算例:
在这里插入图片描述
初始时定义最小子数组的长度为ans=INT_MAX,当找到一组解的时候,会更新“ans = min(ans, end - start + 1);”,最后只需要“return ans == INT_MAX ? 0 : ans; ”来检查ans是否是原来的值,如果是,说明无解,返回0。
查看了网友的讨论,ans也可以设置为nums.size()+1,改过代码后发现仍可以通过所有测试用例。但是在寻找最小值的时候习惯上设置一个比较大的值INT_MAX,该值为+2147483647,找到一组解后立刻更新此值。

该题的C++题解代码为:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        //int ans=nums.size()+1;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum>=s) {
                ans = min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == INT_MAX ? 0 : ans;
        //return ans == nums.size()+1 ? 0 : ans;
    }
};

参考文章:
https://leetcode-cn.com/problems/minimum-size-subarray-sum/solution/chang-du-zui-xiao-de-zi-shu-zu-by-leetcode-solutio/
https://blog.csdn.net/weixin_40539125/article/details/86032914?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-3.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultCTRLISTRate-3.pc_relevant_default&utm_relevant_index=6

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值