代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组 、59.螺旋矩阵II 、总结

本文介绍了如何解决三个编程题目:有序数组的平方计算、长度最小的子数组和螺旋矩阵生成。通过代码示例展示了思路和实现方法,适用于学习者提升算法技能。

977.有序数组的平方

文章讲解:有序数组的平方

视频讲解:有序数组的平方

进度:完成,不会想到

 代码:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {


        int leftindex=0;
        int rightindex=nums.size()-1;
        vector <int> newnums(nums.size(),0);
        int k=nums.size()-1;


        while(leftindex<=rightindex)
        {
            if((nums[leftindex]*nums[leftindex])>(nums[rightindex]*nums[rightindex]))
            {
                newnums[k--]=nums[leftindex]*nums[leftindex];
                leftindex++;
            }
            else
          
            {
                 newnums[k--]=nums[rightindex]*nums[rightindex];
                rightindex--;
            }
        }
        return newnums;
    }
      
    
};

思路:

最大的值在两边,如果左边比右边大,左边指针右移动,并且将该值赋值给新数组下标k所对应的位置。

如果左边比右边小,右边指针左移动,并且将该值赋值给新数组下标k所对应的位置。

209.长度最小的子数组

文章讲解:长度最小的子数组

视频讲解:长度最小的子数组

进度:完成,不会想到

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int i=0;
int sumL=0;
int result=INT32_MAX;;
    for(int j=0;j<nums.size();j++)
    {
        sum+=nums[j];
        
        while(sum>=target){
            
            sumL=j-i+1;
           
            sum=sum-nums[i];
             i++;
             result=min(sumL,result);

        }

    }
 
        return result == INT32_MAX ? 0 : result;
    }
};

思路:

j表示终止位置,当区间大于等于s时候,就让起始位置的后移动

 // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列

59.螺旋矩阵(||)

文章讲解:螺旋矩阵

视频讲解:螺旋矩阵

进度:完成,不会,左闭右开,循环不变量

代码:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

            vector<vector<int>> matrix(n,vector<int>(n,0));
             int off=1;
             int startx,starty=0;
             int count=1;
              int i,j;
              int loop=n/2;
             while(loop--){
                
                 for(j=starty;j<n-off;j++)
                 matrix[startx][j]=count++;
                 for(i=startx;i<n-off;i++)
                 matrix[i][j]=count++;
                 for(;j>starty;j--)
                matrix[i][j]=count++;
                for(;i>startx;i--)
                matrix[i][j]=count++;
                 
                 off++;
                 startx++;
                 starty++;
                
             }
             if(n%2==1)
             matrix[n/2][n/2]=count++;
          return matrix;
      
    }
};

思路:

就左闭右开,一圈圈循环,有n/2圈,定义每圈的startx以及starty,还有距离边的具体,起始是 1

 数组总结

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值