代码随想录算法训练营 | 第二天 | 博客打卡
题目链接:leetcode 59. 螺旋矩阵 II
注:作为个人笔记,不可能做到细致通俗。
拿出你的两根食指,横着的和竖着的相互为轴
- 横的先放着不动,竖的沿着横的,从左向右移动
- 然后竖的不动,横的沿着竖的,从上向下移动
- 接着横的不动,竖的沿着横的,从右向左移动
- 最后竖的不动,横的沿着竖的,从下向上移动
就在这最后一步,要注意,向上移动不能顶到头,看来需要减一层。
所以有四组for循环完成以上四步,还要有一个大循环负责加一减一操作。
现在框架出来了。那么,小循环什么时候结束?大循环什么时候结束?
- 小循环的结束条件是没有移动空间了(移动空间由 top、bottom、left、right 限定)。
- 大循环的结束条件是数字都添加完了。
写代码不要想着从头一行一行地写,先写个框架也不是不行。
比如这道题我就是按框架来写的。
func generateMatrix(n int) [][]int {
top, bottom := 0, n-1
left, right := 0, n-1
num := n * n
for num > 0{
for i; ; {
}
top++
for i; ; {
}
right--
for i; ; {
}
bottom--
for i; ; {
}
left++
num--
}
}
我写了四个小循环,每个小循环底下跟了一个用来缩小圈子的东西。改变起点和终点。
// 第一步就是竖着的指头先向右移动
// 这样的话移动空间就是left到right,不变的是top
// 结束条件就是当right大于left的时候
// 下面同理
for i; ; {
}
// 循环结束后,top++,因为第二步,即竖着的指头向下移动,是在top++的位置开始的,
// 因为最右边一列的第一个元素已经在第一步里加入了,所以是从第二个开始
top++
func generateMatrix(n int) [][]int {
tar := n * n
matrix := make([][]int, n)
for i := 0; i < n; i++ {
matrix[i] = make([]int, n)
}
top, bottom := 0, n-1
left, right := 0, n-1
num := 1
for num <= tar {
for i := left; i <= right; i++ { // top 不动,从左向右
matrix[top][i] = num
num++
}
top++ // 当前行完成赋值,top 下降
for i := top; i <= bottom; i++ { // right 不动,从上往下
matrix[i][right] = num
num++
}
right-- // 当前列完成赋值,right 左移
for i := right; i >= left; i-- { // bottom 不动,从右向左
matrix[bottom][i] = num
num++
}
bottom-- // 当前行完成赋值,bottom 上升
for i := bottom; i >= top; i-- { // left 不动,从下往上
matrix[i][left] = num
num++
}
left++ // 当前列完成赋值,left 右移
}
return matrix
}
top、bottom、left、right 规定着两根杆子可移动范围。