给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
这题目的做法是对二维数组的考核
而求解本题依然是要坚持循环不变量原则。
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
顺时针画则是
[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]
[2][0] [2][1] [2][2]
从左到右 [0][0] -> [0][1] -> [0][2] ,可以看到top是不变的,i=left i<=right i++循环
则matrix[top][i]=num num++. 循环结束 top++。
从上到下 [0][2]-> [1][2] -> [2][2] ,可以看到right是不变的 i=top i<=bottom i++ 循环
则matrix[i][right]=num num++ 循环结束 right--
从右到左 [2][2] -> [2][1] ->[2][0] 可以看到bottom是不变的 i=right i>=lef i--
则matrix[bottom][i]=num num++ 循环结束 bottom--
从下到上[2][0]->[1][0]->[0][0] left是不变的 i=bottom i>=top i-- 循环
matrix[i][left]=num num++ 循环结束 left++
顺时针结束
func generateMatrix(n int) [][]int {
top, bottom := 0, n-1
left, right := 0, n-1
num := 1
tar := n * n
matrix := make([][]int, n)
for i := 0; i < n; i++ {
matrix[i] = make([]int, n)
}
for num <= tar {
for i := left; i <= right; i++ {
matrix[top][i] = num
num++
}
top++
for i := top; i <= bottom; i++ {
matrix[i][right] = num
num++
}
right--
for i := right; i >= left; i-- {
matrix[bottom][i] = num
num++
}
bottom--
for i := bottom; i >= top; i-- {
matrix[i][left] = num
num++
}
left++
}
return matrix
}
此题要搞清楚二维数组
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
每个参数的边界值。