●day 2 第一章 数组part02(1.23)
第一题:209.长度最小的子数组
解题思路
本题要在给定的正整数数组中找出总和大于等于目标值 target
的长度最小的子数组,并返回其长度。若不存在这样的子数组,则返回 0。这里采用滑动窗口的方法来解决,其核心思路是利用两个指针(left
和 right
)动态地维护一个子数组,不断调整子数组的范围,以找到满足条件的最小长度子数组。
具体步骤如下:
- 初始化变量: left:滑动窗口的左指针,初始化为 0,表示从数组的起始位置开始。sum:用于记录当前滑动窗口内元素的总和,初始化为 0。result:用于存储满足条件的最小子数组的长度,初始化为 Integer.MAX_VALUE,方便后续比较更新。
- 移动右指针: 使用 for 循环移动右指针 right,每次将 nums[right] 加入到 sum 中,不断扩大滑动窗口的范围。
- 调整左指针: 当 sum 大于等于 target 时,说明当前滑动窗口内的元素总和满足条件。计算当前滑动窗口的长度 right - left + 1,并使用 Math.min 函数更新 result,取当前 result 和新长度中的较小值。接着将 nums[left] 从 sum 中减去,并将左指针 left 右移一位,缩小滑动窗口的范围,继续检查新的窗口是否仍然满足条件。
- 返回结果: 若遍历完整个数组后,result 仍然等于 Integer.MAX_VALUE,说明不存在满足条件的子数组,返回 0;否则返回 result。
class Solution { public int minSubArrayLen(int target, int[] nums) { int left = 0; int sum = 0; int result = Integer.MAX_VALUE; for(int right = 0;right < nums.length;right++){ sum += nums[right]; while(sum >= target){ result = Math.min(result,right - left + 1); sum -= nums[left]; left++; } } if(result == Integer.MAX_VALUE){ return 0; }else{ return result; } } }
第二题:59.螺旋矩阵II
解题思路
本题要求生成一个包含 1 到 所有元素,且元素按顺时针顺序螺旋排列的
正方形矩阵。解题的关键在于按顺时针方向逐层填充矩阵元素,从外层到内层依次进行。
具体步骤
- 初始化矩阵和变量: 创建一个 的二维数组 nums 用于存储矩阵元素。startX 和 startY 分别表示当前层的起始行和起始列,初始值都为 0。loop 表示当前是第几层循环,初始值为 1。offset 用于控制每一层循环的边界,初始值为 1。count 用于记录当前要填充的数字,初始值为 1。
- 循环填充矩阵层: 使用 while 循环,循环条件为 loop <= n / 2。每一次循环填充矩阵的一层,从外层向内层进行。在每一层中,按顺时针方向依次填充四个边: 从左到右:固定行 startX,列 j 从 startY 递增到 n - offset,将 count 赋值给 nums[startX][j],并将 count 加 1。从上到下:固定列 j,行 i 从 startX 递增到 n - offset,将 count 赋值给 nums[i][j],并将 count 加 1。从右到左:固定行 i,列 j 从当前位置递减到 startY,将 count 赋值给 nums[i][j],并将 count 加 1。从下到上:固定列 j,行 i 从当前位置递减到 startX,将 count 赋值给 nums[i][j],并将 count 加 1。完成一层的填充后,loop 加 1,offset 加 1,startX 和 startY 都加 1,进入下一层的填充。
- 处理奇数阶矩阵的中心元素: 如果 n 是奇数,矩阵的中心元素在循环结束后还未填充,需要单独处理。此时 startX 和 startY 正好指向矩阵的中心位置,将 count 赋值给 nums[startX][startY]。
- 返回结果: 填充完成后,返回生成的矩阵 nums。
循环次数为什么是 ![n/2](https://hr.nowcoder.com/equation?tex=n%2F2&preview=true)
可以把矩阵想象成一个洋葱,每一层循环就像是剥掉一层洋葱皮。对于一个 的矩阵,当
为偶数时,矩阵可以被完整地分成
层,每层都需要进行填充操作。例如,当
时,矩阵可以分成两层,先填充外层,再填充内层。当
为奇数时,虽然最中心有一个单独的元素,但除了这个中心元素外,其余部分同样可以分成
层,而循环次数依然可以用
来表示(因为在 Java 中整数除法会向下取整)。所以,循环次数设置为
可以确保对矩阵的每一层进行正确的填充。
class Solution { public int[][] generateMatrix(int n) { int[][] nums = new int[n][n]; int startX = 0,startY = 0; int i,j; int loop = 1,offset = 1,count = 1; while(loop <= n / 2){ for(j = startY;j < n - offset;j++){ nums[startX][j] = count++; } for(i = startX;i < n - offset;i++){ nums[i][j] = count++; } for(;j > startY;j--){ nums[i][j] = count++; } for(;i > startX;i--){ nums[i][j] = count++; } loop++; offset++; startX++; startY++; } if(n % 2 == 1){ nums[startX][startY] = count; } return nums; } }#螺旋矩阵##滑动窗口双指针问题##算法刷题#