part2
209.长度最小的子数组
分析
- 区间 左闭右闭 左指针
l
右指针r
- 滑动窗口,如何滑动
- 区间内的值大于等于target 比较记录区间大小
r-l+1
左指针向右移动 - 区间内的值小于target 右指针向右移动
- 区间内的值大于等于target 比较记录区间大小
- 如何终止
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
分析
- 算出填充总数
n^2
- 顺时针缩减 上下左右边界
top/bottom/left/right
分别起始0/n-1/0/n-1
,x/y
为填充坐标x==top y<right
,左上到右上y
自增,y==right
时top++
y==right x<bottom
,右上到右下x
自增,x==bottom
时right--
x==bottom y>left
,右下到左下y
自减,y==left
时bottom--
y==left x>top
,左下到右上x
自增,x==top
时left++
代码
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
}