学习目标:
- 掌握数组相关算法
学习内容:
- 滑动窗口
- 前缀和
- 边界值把握
学习时间:
- 2025-05-15周四晚上
学习产出:
- 209.长度最小的子数组
解题思路
采用快慢指针方式,如果和大于目标值,计算当前长度,满指针+1,并循环判断移动后是否仍大于目标值,如果是则继续慢指针+1。z注意累计求和时要减去满指针当前值。如果小于目标值,则快指针+1,直至完成遍历。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int fast=0;
int slow=0;
int curLength=Integer.MAX_VALUE;
int length = nums.length;
int result=0;
while(fast<length) {
result = result + nums[fast];
while(result >= target) {
curLength = (fast-slow +1) > curLength ? curLength:(fast-slow+1);
result = result - nums[slow];
slow++;
}
if(fast < length) {
fast++;
}
}
// 可修改为for循环
return curLength == Integer.MAX_VALUE ? 0:curLength;
}
}
- 59.螺旋矩阵II
解题思路
本题思路混乱,陷入循环怪圈,看了卡哥思路才勉强参照解题
注意点:
- 处理每一条边要保证判断条件保持一致,即永远保持左闭右开
- 循环圈数,每一圈处理两条边,则循环圈数必定是n/2
- 当n为基数时,最后一个中间值即为n*n
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
// 起始点
int startX=0;
int startY=0;
int offset = 1;
int curNum = 1;
int loop = 1;
int i ,j;
while (loop <= n/2) {
for(j=startY;j<n-offset;j++){
nums[startX][j] = curNum++;
}
for(i=startX;i<n-offset;i++) {
nums[i][j] = curNum++;
}
for(;j>startY;j--){
nums[i][j] = curNum++;
}
for(;i>startX;i--) {
nums[i][startY] = curNum++;
}
loop++;
startX++;
startY++;
offset++;
}
if (n % 2 ==1) {
nums[startX][startY] = curNum;
}
return nums;
}
}
- 58. 区间和
初次学习前缀和算法,尚未开始解题,仅仅学习了思路。即算过的部分不需要再次计算,或许类似动态规划苏算法,待明日继续学习。