长度最小的子数组
- 这道题让找最短的满足大于等于target的数组长度,暴力思想就是,用两层for循环,i代表区间的左边界,j代表区间的右边界,然后判断最小的区间长度,返回。
- 暴力方法时间复杂度大,需要改善,遍历区间的问题,其实就是相当于双指针,i是左边的指针,j是右边的指针。滑动窗口其实和双指针的思想是一样的,只需要一层for循环。
- 一层for循环遍历数组的话,需要知道这个for循环里面的变量j是区间的起始位置还是终止位置
a. 如果是起始位置,我们遍历一遍这个j,然后结束位置我们也需要再遍历一遍,和暴力解法没什么区别
b. 所以j应该是结束位置
- 那起始位置怎么移动呢?这其实就是滑动窗口问题的本质,移动起始位置,找到相应的区间。起始位置的移动需要满足一些条件,比如这个题就需要满足这个区间的和是大于等于target的,就可以向前移动了,从而找到最优解。
public int minSubArrayLength(int[] nums,int target){
int i = 0;
int sum = 0;
int subL = 0;
int res = Integer.MAX_VALUE;
for(int j = 0;j < nums.length;j++){
sum += nums[j];
while(sum >= target){
sum -= nums[i];
res = Math.min(res,j-i+1);
i++;
}
}
return res == Integer.MAX_VALUE ? 0 : res;
}
螺旋矩阵II
- 这个其实就是模拟题,模拟整个构造数组的过程,其实就是模拟每一圈的构造过程。
- 既然是数组,就有横纵坐标i和j,需要遍历数组赋值。 只需要搞清楚一个问题:怎么遍历,边界条件怎么处理?
- 边界条件其实和Day1里面的二分查找的循环不变量是一样的,需要保证遍历的每一条边的区间的开闭状态都是一样的(j < n-startY-1),遍历n/2圈,奇数的话需要再填充一些最中心的位置的值。
public int[][] generateMatrix(int n){
int count = 0;
int startX = 0;
int startY = 0;
int m = 0;
while(m < n/2) {
//遍历第一行,相当于j在变化
int j = startY;
int i = startX;
for(;j < n-startY-1;j++){
count++;
nums[i][j] = count;
}
//遍历最后一列
for(;i < n- startX-1;i++){
count++;
nums[i][j] = count;
}
//遍历最后一行
for(;j > startY;j--){
count++;
nums[i][j] = count;
}
//遍历第一列
for(;i > startX;i--){
count++;
nums[i][j] = count;
}
m++;
startX++;
startY++;
}
return nums;
}