代码随想录算法训练营--打卡day2
一.长度最小的子数组
1.题目链接
209. 长度最小的子数组 - 力扣(LeetCode)
2.思路
采用滑动窗口算法,通过两个指针(这里用
i
和j
表示)动态调整窗口的大小
3.代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0;
int j=0;
int sum=0;
int result=Integer.MAX_VALUE;
for(;j<nums.length;j++){
sum+=nums[j];
while(sum>=target){
result = Math.min(result, j-i+1);
sum-=nums[i];
i++;
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}
二.螺旋矩阵
1.题目链接
59. 螺旋矩阵 II - 力扣(LeetCode)
2.思路
原则:左闭右开原则
循环圈数: n/2
3.代码
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
/每一圈填充的起始坐标,初始化为 (0, 0)。
int startX = 0, startY = 0;
/offset 是偏移量,用于控制每一圈填充的边界范围,初始值设为 1
int offset = 1;
int count = 1; / 矩阵中需要填写的数字
int loop = 1; / 记录当前的圈数
int i, j; / j 代表列, i 代表行;
while (loop <= n / 2) {
/顶部
/左闭右开,所以判断循环结束时, j 不能等于 n - offset
for (j = startY; j < n - offset; j++) {
nums[startX][j] = count++;
}
/右列
/左闭右开,所以判断循环结束时, i 不能等于 n - offset
for (i = startX; i < n - offset; i++) {
nums[i][j] = count++;
}
/底部
/左闭右开,所以判断循环结束时, j != startY
for (; j > startY; j--) {
nums[i][j] = count++;
}
/左列
/左闭右开,所以判断循环结束时, i != startX
for (; i > startX; i--) {
nums[i][j] = count++;
}
startX++;
startY++;
offset++;
loop++;
}
/ n 为奇数时,单独处理矩阵中心的值
if (n % 2 == 1) {
nums[i][j] = count;
}
return nums;
}
}