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

文章介绍了在LeetCode上用双指针法解决有序数组平方问题和滑动窗口法求最短子数组长度问题,以及如何构建螺旋矩阵。解题关键在于理解并灵活运用这两种算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 leetcode977题.有序数组的平方

题目链接:    977. 有序数组的平方 - 力扣(LeetCode)

解题思路: 

利用双指针法,比较左右指针对应的数的平方和,把值比较大的放在数组右边.

易错点:

while循环这里,需要 left 和right相等吗?  需要,假设不想等的话,循环到最后只剩下两个元素的时候,把最大值的平方一记录,另外一个就落下了. 

遗留疑问:

这个题目,给的参考答案里面,重新new了一个数组,直接利用原有数组,不重新new数组, 可以整出来嘛???

class Solution {

        public int[] sortedSquares(int[] nums) {

        int left = 0;

        int right = nums.length - 1;

        int[] arr = new int[nums.length];

        int index=nums.length - 1;

        while (left <= right) {

            if (nums[left] * nums[left] < nums[right] * nums[right]) {

                arr[index--] = nums[right] * nums[right];

                right--;

            } else  {

                arr[ index--]=nums[left] * nums[left];

                left++;

            }

        }

        return arr;

    }

}

leetcode  209.长度最小的子数组 

题目链接:   力扣

解题思路: 

利用滑动窗口,计算窗口下的值是否>=target.,满足>=target时,记录窗口的最小值.

一旦满足sum>= target的时候,执行减去窗口左边的值,窗口左边右移,重新记录(更新)满足条件的窗口内的连续数组的最小长度.  只要满足sum>= target,while循环可以一直执行.

窗口

 本题目没有想到的地方是: 

1. 要使用while循环.自己使用的是if循环.

 假如滑动窗口尾部的 靠右边的值比较大,头部 靠左边的值比较小, 满足sum >= target时,循环内部的内容就要执行多次.

比如这组测试用例:   target = 7, nums = [2,3,1,2,4,3]

执行到1,2,4,3的时候,窗口的右边已经到数组的右边界,可以重复的while循环,才能得到4,3这个最短的连续数组.

2. 结尾处返回二元表达式,我直接返回的是min.

class Solution  {

           public int minSubArrayLen(int target, int[] nums) {

        int sum = 0;

// 记录滑动窗口对应数组长度的最小值

        int min = Integer.MAX_VALUE;

        int left = 0;

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

            sum += nums[right];

            while (sum >= target) {

                min=Math.min(min,right-left+1  )  ;

                sum-=nums[left];

                left+=1;

            }

        }

        return min==Integer.MAX_VALUE ? 0: min;

    }

    }

leetcode 59.螺旋矩阵

题目链接:  力扣

解题思路:

  我实在想不出来需要定义这么多变量.这个题目实际也考察二维数组 

int[][] arr = new int[n][n]  的打印效果.可以尝试打印如图的数组辅助理解,什么时候该操作第一个

n,什么时候操作第二个n.

 

class Solution {

       public int[][] generateMatrix(int n) {

        int[][] arr = new int[n][n];

        // 定义填充数字

        int count = 1;

        int i = 0, j =0;

        // 定义循环圈数

        int loop = 0;

        // 每圈开始的位置

        int start = 0;

        while (loop++ < n / 2) {  // loop=1

            for (j = start; j< n - loop; j++) {

                arr[start][j] = count++;

            }

            for (i = start; i < n - loop; i++) {

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

            }

            for (; j >= loop; j--) {

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

            }

            for (; i >= loop; i--) {

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

            }

            start++;

        }

        if (n % 2 == 1) {

            arr[start][start] = count++;

        }

        return arr;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值