代码训练营第二天

注意:

递减顺序 就是只能严格递减 两个元素不能相等

但是非递增顺序 可以元素相等 

 977.有序数组的平方 

class Solution {

public:

    vector<int> sortedSquares(vector<int>& nums) {

        vector <int> a(nums.size());

        int left=0,right=nums.size()-1;

        int k=nums.size()-1;

        while(left<=right){

            if(nums[left]*nums[left]>=nums[right]*nums[right])

            {

                a[k--]=nums[left]*nums[left];

                left++;

            }

            else{

                a[k--]=nums[right]*nums[right];

                right--;

            }

        }

        return a;

    }

};

非常简单的小题 二刷 典型的空间换时间 唯一注意的是(也是我的错误):不能用a[nums.size()-1] 这样a后面的没变化 永远都是那一个变量 只能用a[K] 用一个变量来替代

class Solution {

public:

    int minSubArrayLen(int target, vector<int>& nums) {

        int slow=0,fast=0,sum=0,result=nums.size()+1,length;

        while(fast<nums.size()){

            sum=sum+nums[fast];

            while(sum>=target){

                length=fast-slow+1;

                result=result<length?result:length;

                sum=sum-nums[slow++];

            }

            fast++;

        }

        if(result==nums.size()+1){

            return 0;

        }

        else return result;

    }

};

这道滑动窗格就花了不少时间 虽然是二刷 但是要是有很多问题 

问题1 就是对于滑动窗格的理解不够 它其实是两层循环 而不是一层循环然后套一层if 因为内层的不只是减去一个就能刚刚好比target大的 所以是两层循环 

问题2 因为这个是要更新result的值 来选取最小的  所以必须得有一个临时变量来保存之前最小的值 并且这个变量还要和现在的值相比较 但是有个问题就是这样还得区分第一次来给这个变量赋个值 就很麻烦 所以不如直接把result的值设为size+1 这样是最大的 比它小的直接就改就行 如果最后也没改那么就是return 0; 这样就很巧妙。 而不是说非得弄个临时变量 然后第一次用来记录这个值 然后后面几次再去相比较 当然经过后面的尝试也可以说是 第一次result是0 就去赋值 然后第二次再去比较 就是麻烦一点

像这样:

class Solution {

public:

    int minSubArrayLen(int target, vector<int>& nums) {

        int slow=0,fast=0,sum=0,result=0,length;

        while(fast<nums.size()){

            sum=sum+nums[fast];

            while(sum>=target){

                length=fast-slow+1;

                if(result==0){

                    result=length;

                }

                else {

             result=result<length?result:length;

                }

               

                sum=sum-nums[slow++];

            }

            fast++;

        }

        if(result==0){

            return 0;

        }

        else return result;

    }

};

其实就是代码冗长了一点 而且不够巧妙 就是也可以但是可以简化一点 就统一 不用把第一次单列出来了 主要是得能想到把result 设为最大而不是0 。

第三道题 螺旋矩阵

这个题是第二次做 但是一上来还是没思路 关键是没理解二维矩阵 其实不管是这个钜阵有多少行 还是有多少列 它始终是二维的 因为三维数组是立体的 所以平面的就是二维。

另外还有一个问题就是 在二维数组赋值的时候不是只能一行一行的赋值 而是可以行先赋完再列赋 就是螺旋赋值

第三个问题就是循环不变量原则 在循环中不变的条件始终不变 左闭右开 就始终是左闭右开

第三个问题就是 要控制边界 ,那就必须有起始行和起始列,然后后面的边界再用n去减

第四个问题就是 还要有一个控制边界的offset 每次要增一 不用这个的话 直接用n--可能也写

第五个问题是 给二维数组赋值 不是赋坐标 而是直接赋 因为每个二维数组就已经是一个坐标了 只要赋值就可以了

第六个问题 还是要有一个offset变量 因为不能直接用n 那样会出问题 所以还要有i和j变量来封装n

第七个问题 就是因为第三个循环的时候 不能直接用n>0 要大于下界 所以起始变量也需要用i和j封装一下 

第八个问题就是要区分奇偶 因为这是按四个边赋值的 会赋值四次 如果你中间只有一个值的话 就会把边上的一起也赋值了 那个就乱了 

第九个问题就是 n是行而不是平方 不要搞混了

第十个问题:注意!注意! 数组下标是从0开始的 endy应该是n-1

class Solution {

public:

    vector<vector<int>> generateMatrix(int n) {

         vector<vector<int>> a(n,vector<int>(n,0));

         int startx=0,starty=0,count=1,endx=n-1,endy=n-1;

        while(startx<endx){

         for(int i=startx,j=starty;j<endy;){

             a[i][j++]=count++;

         }

        

        for(int i=startx,j=endy;i<endx;){

            a[i++][j]=count++;

        }

        for(int i=endx,j=endy;j>starty;){

            a[i][j--]=count++;

        }

        for(int i=endx,j=starty;i>startx;){

            a[i--][j]=count++;

        }

        startx++;starty++;endy--;endx--;

        }

        if(n%2==1){

            a[n/2][n/2]=n*n;

        }

        return a;

    }

};

截止到晚上22点做完 还是有点慢速

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值