算法训练第三天

代码随想录算法训练|第三天

感觉自己每天的进度和速度都会不一样,今天因为下午是满课的,所以少了一整个下午的时间来学习,所以时间会不太够。之后要是下午水课比较多的话,我直接带电脑去教室写代码算了,这样子至少可以避免时间被全部浪费。

每天刷的算法题目的多少刚开始不要太在意了,重点还是说要知道自己学了什么内容,这个内容做的是什么才重要。就和健身一样,认认真真的做高质量组,健身的质量会比随随便便做很多组要好很多。

209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

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

思路:

方法一

第一种想法就是双层for循环暴力求解,设置变量一个保存大小,一个保存长度

但是这个暴力求解对于算法新手来说也不是那么的简单,很多细节上的内容也需要多去思考

运行的结果是超出时间限制的,但是实现的思路是肯定没有问题的

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        if(target < 0 || nums.size() == 0)
        {
            return 0;
        }
        int result = INT32_MAX; //最终返回的结果
        int NumArrSize = 0; //数组的长度
        int SumArr = 0; //子序列的数值
        for(int i = 0; i < nums.size(); i++)
        {
            SumArr = 0;
            for(int j = i; j < nums.size(); j++)
            {
                SumArr += nums[j];
                if(SumArr >= target)
                {
                    NumArrSize = j-i+1;
                    result = NumArrSize < result?NumArrSize:result;
                    break;
                }
            }
        }
        return result == INT32_MAX? 0:result;
    }
};

方法二

我们要知道什么是滑动窗口的内容

滑动窗口本质上也是一个双指针,但是我们要知道的是,滑动窗口最重要的内容其实是,我们如何去移动这个起止位置和这个终止位置

其实实现的代码不是很难,但是代码中有很多细节值得去琢磨

  1. 滑动窗口中的两个指针分别是指向了什么位置

  2. for循环内如何去设置判断的条件

    class Solution {
    public:
        int minSubArrayLen(int target, vector<int>& nums) {
            if(target < 0 || nums.size() == 0)
            {
                return 0;
            }
            int result = INT32_MAX;
            int SubLen = 0;
            int i = 0;
            int Sum = 0;
            for(int j = 0; j < nums.size(); j++)
            {
                Sum += nums[j];
                while(Sum >= target)
                {
                    SubLen = j-i+1;
                    result = result > SubLen? SubLen :result;
                    //这个时候固定了j的位置,开始移动i的位置
                    Sum -= nums[i++];
                }
            }
            return result == INT32_MAX?0:result;
        }
    };
    

    第一次写的时候还是出错了的,但是感觉自己多少可以写一点东西出来,只是不是特别的熟练的感觉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值