代码随想录训练营第38期Day2


前言

今天是第二天跟着代码随想录刷题,主要学习了两个内容,一个是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

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值