203. 长度最小的子数组

题目

看了卡哥的视频后,写了如下代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int i = 0, j = 0;
        for (j = 0; j < nums.size(); j ++ )
        {
            sum += nums[j];
            while (sum >= target)
            {
                result = min(result, j - i + 1);
                sum -= nums[i ++ ];

            }
        }
        return result == INT32_MAX ? 0 : result; 
    }
};

几个注意点:

  • 因为是求最小值,所以将result初始化为INT32_MAX,同时与min函数配合,求出答案。

  • 注意此题的i不会回溯,i是一直向前走的,j是一直向后走的。

    为什么i是一直向前走的?

    当改变j的值时(即j ++ ),i不会重新赋值为0,因为我们要求的是长度最小的子数组,将i赋值为0没有意义(为什么没意义?因为从0到还没赋值为0的那个i都不会导致比上一个result更优的result,应该从还没赋值为0的那个i的后一个位置开始考虑)

  • 应该是while (sum >= target)而不是while (sum > target)

    因为sum == target的时候对应的ij可能对应着答案,我们要让sum == target这个情况进入while处理。

posted @   hisun9  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
点击右上角即可分享
微信分享提示