您现在的位置是:首页 >学无止境 >代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结网站首页学无止境

代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结

佳豪努力成为乐子人 2023-06-01 20:00:02
简介代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结

977有序数组的平方

先看题
在这里插入图片描述
我们先来理解题目的意思 将这个数组每个值都平方 然后 重新排序

这个时候我们疑惑的点是 平方以后我们如何重新排序

这里提供一个思路 使用双指针法 什么是 双指针 顾名思义 让两个指针分别指向这个数组的开头和结尾
为什么这样设计呢
首先我们思考一个问题 ,要给他们重新排序 ,是不是要比较他们的大小,难点就在于我们如何比较他们的大小 。

我们给这个数组开头和结尾一个指针,将开头第一个元素平方后赋给新的数组 ,新数组的长度和旧数组一样, 这样做的目的在于 方便排序 把这个数当作最大的 ,然后和旧数组最后一个元素平方比较 ,如果大 那就这个赋给新数组 如果小 就把大的赋给新数组。
下面是我写的代码 可以参考

class Solution {
    public int[] sortedSquares(int[] nums) {
     int[] nums2 = new int[nums.length];
     int  k = nums.length-1;
      int i=0;
      int j=nums.length-1;
     while(i<=j){
         if(nums[i]*nums[i] >= nums[j]*nums[j]){
             nums2[k]=nums[i]*nums[i];
             k--;
             i++;

         }else{
                nums2[k]=nums[j]*nums[j];
                k--;
                j--;
                  }
       
     }
     return nums2;
    }

209长度最小的子数组

题目如下
在这里插入图片描述
解题思路 :窗口滑动 也是双指针的变形 起始指针和终止指针都指向 数组的第一个元素 ,终止指针前移,算出终止到起始指针的元素总和 然后和目标进行对比 ,直到 比目标大 然后开始 移动 起始指针 算出起始到终止的位置

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
       
        int i=0;
        int subl=0;
        int sum =0;
        int res = Integer.MAX_VALUE;
     for(int j=0;j<nums.length;j++){
         sum += nums[j];
         while(sum >= target){
             subl=j-i+1;
             res = Math.min(res ,subl);
             sum =sum -nums[i];
             i++;

         }
        }
       return res ==  Integer.MAX_VALUE ? 0: res;
            

        }

    }

螺旋矩阵

这道题的解法稍微有些复杂 主要考虑到边界问题的分析
本质上是一道模拟题;
在这里插入图片描述

class Solution {
    public int[][] generateMatrix(int n) {
        int loop =0;
        int offset =1;
        int[][] res = new int[n][n];
       int start =0;
  
       int count =1;
       int i ,j;
        while(loop++ <(n/2)){
            for( j= start; j< n-offset;j++){
                res[start][j] = count++;
            }
            for( i =start; i<n-offset;i++){
                res[i][j] = count++;
            }
            for( ;j>=loop;j--){
                res[i][j] = count++;
            }
            for (;i>=loop; i--){
                res[i][j] = count++;
            }

            start++;
            offset++;
      
            }
          if(n % 2 ==1){
                res[start][start] =count;
            }
       return res;

    }


}

写这个代码的时候 需要注意一点 第二次循环的时候 坐标都变大了 也就是说 无论是第一序列(行)
还是第二序列(列) 坐标都变了 相应的 第二个内循环也需要变换 边界 也就是 -1 变成了 -2 。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。