• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

代码随想录算法训练营 day02

武飞扬头像
月亮偷着哭...
帮助1

目录

977.有序数组的平方

正解:

209.长度最小的子数组

正解:

59.螺旋矩阵

正解:


977.有序数组的平方

最开始的想法是用循环先实现数组元素的平方,再写个双层循环实现排序操作.但是我觉得这样效率肯定很低,可是我也想不出其它办法,看了文章说双指针,想起昨晚还写了使用双指针解题,但是今天我依然不会灵活使用它,脑子里面想的还是和上一题的动画一样.

看了文章的文字描述和动画演示,我就去自己实操,哈哈,问题来了,数组怎么定义我都忘了,琢磨了好久,最开始我以为应该就是这样写的,但是把整个代码执行,直接报错啦,蒙蔽的我只有去看看正解代码的数组定义,然后再测试和提交,第一次没有通过,因为我的while循环条件没写左右下标相等的情况,光是脑子想也想不出过所以然,还是多在纸上画画吧.这道题完成的整个过程我觉得很不错,比我最初想用双循环解题,甚至还没想到直接调用排序的函数好多了,指针得多加练习,加油.

正解:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int i=0,j=nums.length-1,k=nums.length-1;
        int[] result=new int[nums.length];

       while(i<=j){
            if(nums[i]*nums[i]<nums[j]*nums[j]){
                        result[k--]=nums[j] * nums[j];
                        //参与了result数组的新元素添加的下标要移动一次
                        j--;
                    }else{
                        result[k--]=nums[i] * nums[i];
                        i  ;
                    }
       }
       return result; 
    }
}
学新通

209.长度最小的子数组

最开始我是怎么想的呢?玩了会手机 都有点记不起了 ...印象中最大的难点就是怎么比较本次长度和上次记录的长度,从而在循环结束时拿到最小的长度.我写了if语句 但是我觉得放在那里都不合适,改过去改过来,还是不会..接着我就去看了文章里面的代码怎么写的,一开始我看到 res=res<nLength ? res:nLength; 其实不是很能理解,我在想res一开始应该有个有意义的值啊,不然怎么比较啊,我始终觉得res第一次就因该存放第一次满足条件得到的长度值,但是这样想法的代码,我怎么写都不会,后来我终于理解了文章里面的 int result = INT32_MAX; 这个就是取一个超大值,保证数组里面的相加长度不会超出它,就可以在 [? :] 语句中拿到有意义的长度值了.而且我觉得这个代码处理最后没有得到最小长度的思路也很棒 反之我觉得我目前的实力是想不出来的 哈哈哈.

还有一点就是 处理下一个窗口的思路,我自己想的是 j--,i ,然后再下一次循环中,得到一个窗口;看了文章里面的处理方式,我觉得很厉害,sum -=nums[i ]; 一句话就搞定了,放在while循环里面更是完美,因为想到时间复杂度o(n),我就以为有了for循环那就不要再来个while循环了,复杂度这块还是没学好,我觉得还挺难的,,,,

正解:

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
       //滑动窗口,只用一个for循环,这个循环的索引作为终止位置
       int i=0;
       int sum=0;
       int res=2147483647;//int最大值 
       int nLength=0;
        for(int j=0;j<nums.length;j  ){
            sum =nums[j];
               while(sum>=target){
                nLength=(j-i 1);
                res=res<nLength ? res:nLength;
                sum -=nums[i  ];
                }
        }
        return  res==2147483647 ? 0:res;
    }
}
学新通

59.螺旋矩阵

正解:

class Solution {
    public int[][] generateMatrix(int n) {
      int[][] res=new int[n][n];//
      int loop=0,start=0,count=1;//loop:循环次数 start:起点 count:填充数字
      int i,j;
      while(loop   < (n/2)){
          //走完上右下左四边,保持左闭右开[只处理左边]的原则
            for(j=start;j<n-loop;j  )
                  res[start][j]=count  ;

            for(i=start;i<n-loop;i  )
                  res[i][j]=count  ;

            for(;j>start;j--)
                   res[i][j]=count  ;

            for(;i>start;i--)
                  res[i][j]=count  ;
          //走完了,起点就递增,进入内圈
          start  ;
      }
      //处理奇数矩阵中,圈圈走完了,还有中心点没有赋值
      if(n%2==1) res[start][start]=count;
      return res;
    }
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgghjkk
系列文章
更多 icon
同类精品
更多 icon
继续加载