打卡第二天|力扣977. 有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II

本文提供了解决977.有序数组的平方问题的两种方法:直接排序与双指针技巧,并介绍了209.长度最小的子数组的滑动窗口解法,以及59.螺旋矩阵II的坐标法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天是打卡第二天,废话不多说,看题,链接如下:

977. 有序数组的平方

这道题因为数据范围在10的4次方 ,数据不大所以我们直接进行平方

然后用一个C++自带的sort函数,就那么轻松的写出来了

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
     for(int i=0; i<nums.size(); i++){
         nums[i] = nums[i]*nums[i];
     }
     sort(nums.begin(),nums.end());
     return nums;
    }
};

但是有没有更巧妙的方法,当然有,双指针它又来了

能使用双指针的原因是因为最大的数永远在平方后数组的两端,然后依次往内缩小

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
//初始化容器
     vector<int>res(nums.size(),0);
//倒序放入新容器
     int k = nums.size()-1;
//先不要i++,j-- 符合条件再更新二者其一,i为左指针,j为右指针
     for(int i = 0,  j = nums.size()-1; i<=j; ){
//更新操作
         if(nums[i]*nums[i] > nums[j]*nums[j]){
             res[k--] = nums[i]*nums[i];
             i++;
         }else{
             res[k--] = nums[j]*nums[j];
             j--;
         }
     }
     return res;
    }
};

时间复杂度为O(n)。

209题链接如下

209. 长度最小的子数组

这是一道滑动窗口的题目,一般的滑动窗口还是会做的,但是这个窗口大小会改变就让我有点摸不着头脑,如果窗口大小变就是队列了吧

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
   int i = 0, res = INT32_MAX;
   int sum = 0;
//j表示终点位置 i是循环不变量
   for(int j = 0; j < nums.size(); j++){
        sum += nums[j];
       while(sum >= target){
           int len = j-i+1;
           res = min(len,res);
           sum -= nums[i];
           i++;
       }
   }
   return res ==INT32_MAX ? 0 : res;
    }
};

要注意res要取一个最大值INT32_MAX而不是nums.size()

59题链接如下59. 螺旋矩阵 II

这个之前自己写过类型的矩阵问题,用的是坐标的方法,也感觉这个方法更好懂

自己以前写过的矩阵

#include<iostream>

using namespace std;

int q[100][100];

int main(){
    int n,m;
    cin>>n>>m;
    int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0};
    
    for(int x = 0,y=0,d=0,k=1; k<=n*m;k++){
        q[x][y] = k;//k计数 此次递增
        int a = x+dx[d], b=y+dy[d];//初始位置0,0
        if(a<0 || a>=n ||b<0 ||b>=m ||q[a][b] ){//判断边界
            d=(d+1)%4;//转方向 依次右下左上
            a=x+dx[d],b=y+dy[d];//加上偏移量
        }
        x=a,y=b;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            printf("%d ",q[i][j]);
        }
        printf("\n");
    }
    
    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr丶锤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值