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

977.有序数组的平方

题目链接:leetcode

  • 已知条件:已经提供好的升序数组

  • 思路:双指针法

  • ①双指针法 典型的用空间换时间

  • ②因为绝对值最大的元素只能出现在数组两侧,所以设置两个指针分别指向数组两侧,通过比较其平方的大小,将平方值大的元素放在新数组的末位置,这样达到目的

public static int[] sortedSquares(int[] nums) {
        int[] result = new int[nums.length];//申请n个空间的结果集存放数据,从大到小存放数据
        int left,right;
        left = 0;
        right = nums.length - 1;
        int index = nums.length - 1;
        //双指针设置while循环
        while(left <= right){
            if(nums[left] * nums[left] <= nums[right] * nums[right]){
                // result[nums.length - 1 - i] = nums[right] * nums[right];
                result[index--] = nums[right] * nums[right];
                right--;
            }else{
                result[index--] = nums[left] * nums[left];
                left++;
            }
        }
        return result;
}

209.长度最小的子数组⭐️

题目链接:leetcode

  • 思路:双指针法(滑动窗口)
  • 限制条件:数组里面的数字都为正整数,所以才能用滑动窗口
  • ①设置两个指针,一个为起始位置指针,一个为指向末尾的指针,指向末尾的指针不断向后移
  • ②当发现起始位置和末尾位置元素之和 >= 给定target,那么停止末尾指针滑动;使初始位置指针开始滑动,每次滑动初始位置指针记录下当前子串长度(result),直到sum < target停止滑动(这是不用让左指针为0,此时指向位置已经是在right确定情况下的最小长度了)
  • ③通过上述比较,获取子串的最终位置

感受:仍需加强理解啊!!!

//滑动窗口==>双指针   一个for循环代替两个for循环事情
    //关键点1: j代表终止位置,一个个向后移动
    //       当发现集合中的元素和大于给定值,移动起始位置
    //关键点2:从起始位置开始缩小长度
    //关键点3:在经历了一次滑动窗口后,起始位置的位置不用动
    
    public int minSubArrayLen(int target, int[] nums) {
        int result = Integer.MAX_VALUE;
        int left = 0;
        int sum = 0;

        for(int right = 0;right < nums.length;right++){

            sum += nums[right];
            while(sum >= target){//大于等于,判断0情况

                result = Math.min(result, right - left + 1);
                sum -= nums[left];
                left++;

            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;//最后一步做判断是否有符合条件的长度
}

59.螺旋矩阵II

题目链接:leetcode

  • 思路:

  • 因为本题涉及四条边的表里,遍历的时候一定要遵循一种遍历原则遍历

  • 要注意每次循环交界处的位置的数据的处理
    *代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组:star、59.螺旋矩阵II_第1张图片

  • 循环次数等于n/2

  • 如果循环次数是奇数,要注意中心位置元素的处理

//关键变量:1.每次循环出发点start 2.转几圈 3.每次填充的数字 4.遍历的变量i,j
public int[][] generateMatrix(int n) {
        int start = 0;
        int loop = 0;//从零开始
        int count = 1;
        int[][] arr = new int[n][n];
        int i = 0,j = 0;//列行变量

        while(loop < n / 2){

            // 判断边界后,loop从1开始
            loop++;

            for(j = start;j < n - loop;j++){
                //这必须从start开始,因为最后执行i的话会到第一行
                arr[start][j] = count++;
            }

            for(i = start;i < n -loop;i++){
                arr[i][j] = count++;
            }
            //i,j初始值都已经用过了,所以不用再用
            for(;j >= loop;j--){
                arr[i][j] = count++;
            }

            for(;i >= loop;i--){
                arr[i][j] = count++;
            }
            
            //确保循环出发点+1
            start++;
        }

        //确保特殊情况有值
        if(n % 2 == 1){
            arr[start][start] = count;
        }
        return arr;

    }

你可能感兴趣的:(代码随想录一刷,算法,矩阵,leetcode)