代码随想录算法训练|第三天
感觉自己每天的进度和速度都会不一样,今天因为下午是满课的,所以少了一整个下午的时间来学习,所以时间会不太够。之后要是下午水课比较多的话,我直接带电脑去教室写代码算了,这样子至少可以避免时间被全部浪费。
每天刷的算法题目的多少刚开始不要太在意了,重点还是说要知道自己学了什么内容,这个内容做的是什么才重要。就和健身一样,认认真真的做高质量组,健身的质量会比随随便便做很多组要好很多。
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;
}
};
方法二
我们要知道什么是滑动窗口的内容
滑动窗口本质上也是一个双指针,但是我们要知道的是,滑动窗口最重要的内容其实是,我们如何去移动这个起止位置和这个终止位置
其实实现的代码不是很难,但是代码中有很多细节值得去琢磨
-
滑动窗口中的两个指针分别是指向了什么位置
-
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; } };
第一次写的时候还是出错了的,但是感觉自己多少可以写一点东西出来,只是不是特别的熟练的感觉