公告

微信

欢迎大家私信交流

Skip to content

part2

209.长度最小的子数组

分析

  1. 区间 左闭右闭 左指针l 右指针r
  2. 滑动窗口,如何滑动
    • 区间内的值大于等于target 比较记录区间大小r-l+1 左指针向右移动
    • 区间内的值小于target 右指针向右移动
  3. 如何终止 r>=len(nums)

代码

go
func minSubArrayLen2(target int, nums []int) (ans int) {
	n := len(nums)
	if n == 0 {
		return 0
	}
	
    // 初始化为最大值
	ans = math.MaxInt32 
	l, r := 0, 0
	sum := nums[l]
	
	for r < n {
		if sum >= target {
			ans = min(r-l+1, ans)
			sum -= nums[l]
			l++
		} else {
			r++
            // 防止数组越界
			if r < n { 
				sum += nums[r]
			}
		}
	}
	
    // 没有找到符合条件的子数组
	if ans == math.MaxInt32 {
		return 0 
	}
	return ans
}

59.螺旋矩阵II

分析

  1. 算出填充总数n^2
  2. 顺时针缩减 上下左右边界 top/bottom/left/right 分别起始 0/n-1/0/n-1, x/y为填充坐标
    • x==top y<right,左上到右上y自增,y==righttop++
    • y==right x<bottom,右上到右下x自增,x==bottomright--
    • x==bottom y>left,右下到左下y自减,y==leftbottom--
    • y==left x>top,左下到右上x自增,x==topleft++

代码

go
// 方法1:先移动坐标,再赋值
func generateMatrix(n int) [][]int {
	i, count := 1, n*n

	// 初始化n维数组
	matrix := make([][]int, n)
	for i := range matrix {
		matrix[i] = make([]int, n)
	}

	x, y := 0, 0
	t, b, l, r := 0, n-1, 0, n-1
	matrix[0][0] = i
	i++

	for i <= count {
		if x == t && y < r {
			y++
			matrix[x][y] = i
			if y == r {
				t++
			}
		} else if y == r && x < b {
			x++
			matrix[x][y] = i
			if x == b {
				r--
			}
		} else if x == b && y > l {
			y--
			matrix[x][y] = i
			if y == l {
				b--
			}
		} else if y == l && x > t {
			x--
			matrix[x][y] = i
			if x == t {
				l++
			}
		}
		i++
	}

	return matrix
}

// 方法2:先赋值后移动坐标
func generateMatrix2(n int) [][]int {
	// 初始化n维数组
	matrix := make([][]int, n)
	for i := range matrix {
		matrix[i] = make([]int, n)
	}

	// 边界条件
	init := 1
	num := n * n
	top := 0
	left := 0
	right := n - 1
	bottom := n - 1

	// 移动坐标
	x, y := 0, 0

	for init <= num {
		// 特殊情况处理
		if n == 1 {
			matrix[0][0] = 1
			return matrix
		}

		if x == top && y < right {
			// 从左上到右上
			matrix[x][y] = init
			init++
			y++
			if y == right {
				top++
			}
		} else if y == right && x < bottom {
			// 从右上到右下
			matrix[x][y] = init
			init++
			x++
			if x == bottom {
				right--
			}
		} else if x == bottom && y > left {
			// 从右下到左下
			matrix[x][y] = init
			init++
			y--
			if y == left {
				bottom--
			}
		} else if y == left && x > top {
			// 从左下到左上
			matrix[x][y] = init
			init++
			x--
			if x == top {
				left++
			}
		} else {
			// 处理可能的特殊情况
			matrix[x][y] = init
			init++
		}
	}

	return matrix
}

上次更新于: