代码随想录算法Day02-长度最小的子数组、螺旋矩阵II

长度最小的子数组

  1. 这道题让找最短的满足大于等于target的数组长度,暴力思想就是,用两层for循环,i代表区间的左边界,j代表区间的右边界,然后判断最小的区间长度,返回。
  2. 暴力方法时间复杂度大,需要改善,遍历区间的问题,其实就是相当于双指针,i是左边的指针,j是右边的指针。滑动窗口其实和双指针的思想是一样的,只需要一层for循环。
  3. 一层for循环遍历数组的话,需要知道这个for循环里面的变量j是区间的起始位置还是终止位置
    a. 如果是起始位置,我们遍历一遍这个j,然后结束位置我们也需要再遍历一遍,和暴力解法没什么区别
    b. 所以j应该是结束位置
  4. 那起始位置怎么移动呢?这其实就是滑动窗口问题的本质,移动起始位置,找到相应的区间。起始位置的移动需要满足一些条件,比如这个题就需要满足这个区间的和是大于等于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

  1. 这个其实就是模拟题,模拟整个构造数组的过程,其实就是模拟每一圈的构造过程。
  2. 既然是数组,就有横纵坐标i和j,需要遍历数组赋值。 只需要搞清楚一个问题:怎么遍历,边界条件怎么处理?
  3. 边界条件其实和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;
}
posted @ 2025-07-11 18:39  AAqqs  阅读(18)  评论(0)    收藏  举报