前言
今天是第二天跟着代码随想录刷题,主要学习了两个内容,一个是977.有序数组的平方,一个是209.长度最小的子数组。螺旋矩阵的部分代码没有想出来,怕耽误第二天的进度,放到周日来攻克难题,花了半个下午加半个晚上的时间,整体的效率不算高,明天继续加油吧!
一、977.有序数组的平方
思路:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> result(nums.size(), 0);
for(int i=0,j=k;i<=j;)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
result[k--]=nums[j]*nums[j];
j--;
}
else
{
result[k--]=nums[i]*nums[i];
i++;
}
}
return result;
}
};
注意:sort(A.begin(), A.end()); 可以给数组快速排序;
vector result(nums.size(), 0);创建一个长度为(nums.size(),元素全部为0的数组;
二、209.长度最小的子数组
思路:这里用到一个滑动窗口,滑动窗口一般一个是指向起始位置,一个是指向终止位置。思路就是两个指针,一个在0不动为(j),一个从0开始一直加,加到结束(i),这期间会出现,加到和第一次大于等于目标值的位置,这是最开始的一个长度,此时j慢慢往后移动,然后求和的值把前面的部分剪掉,这时候肯定会出现求和的值比目标值小,然后i在之前的循环中依旧往后移动,增大求和的值,然后每次遇到求和大于等于目标值,都进去while循环里,首先计算长度,并且取长度最短的,然后把j往后移动一位,同时把往前面的部分剪掉,出循环i继续向后移动,如此重复,直到i移动到尾,长度也会迭代到最短的一个输出就可以了,这样就实现i和j的滑动窗口。
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int suml=nums.size()+1;
int len=0;
int sum=0;
for(int i=0,j=0;i<nums.size();i++)
{
sum=sum+nums[i];
while(sum>=target)
{
len=i-j+1;
suml=std::min(len,suml);
sum-=nums[j];
j++;
}
}
if(suml==nums.size()+1)
{
return 0;
}
else
{
return suml;
}
}
};
注:suml=std::min(len,suml);这里是取suml和len最小的值赋给suml