1.1. 题目
1.1.1. 螺旋矩阵 II
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
1.1.2. 题解:
- 数组螺旋旋转.. 顺时针
- 我找了半天规律.. 还是笨办法好使
1.1.3. 思路:
规律不好找,那就笨方法来找规律!
假设第一圈(假设n=9)
- 长度是9,下标从0~8,把第一个值为s=1,每走一个
+1
,遍历到8结束,下标是arr[0][i]
- 高度是8(因为上一步已经算了),下标从1~8,每走一个还是
+1
,遍历到8结束 下标是arr[i][8]
- 长度是8(因为上一步已经算了),下标从7~0,每走一个还是
+1
,遍历到0结束,下标是arr[8][i]
- 高度是8(因为上一步已经算了),下标从7~1,每走一个还是
+1
,遍历到1结束, 下标是arr[i][0]
- 长度是9,下标从0~8,把第一个值为s=1,每走一个
假设第二圈(假设n=9)
- 同上算
写笨代码
//matrix 是二维数组
width := len(matrix[0])
height := len(matrix)
for i:=0;i<width;i++ {
fmt.Println(matrix[0][i],"横向1")
}
for i:=1;i<height;i++ {
fmt.Println(matrix[i][width-1],"纵向1")
}
for i:=width-2;i>=0;i-- {
fmt.Println(matrix[width-1][i],"横向2")
}
for i:=width-2;i>0;i-- {
fmt.Println(matrix[i][0],"纵向2")
}
width2 := 8
height2 := 8
for i:=1;i<width2;i++ {
fmt.Println(matrix[1][i],"横向1")
}
for i:=2;i<height2;i++ {
fmt.Println(matrix[i][width2-1],"纵向1")
}
for i:=width2-2;i>=1;i-- {
fmt.Println(matrix[width2-1][i],"横向2")
}
for i:=width2-2;i>1;i-- {
fmt.Println(matrix[i][1],"纵向2")
}
width3 := 7
height3 := 7
for i:=2;i<width3;i++ {
fmt.Println(matrix[2][i],"横向1")
}
for i:=3;i<height3;i++ {
fmt.Println(matrix[i][width3-1],"纵向1")
}
for i:=width3-2;i>=2;i-- {
fmt.Println(matrix[width3-1][i],"横向2")
}
for i:=width3-2;i>2;i-- {
fmt.Println(matrix[i][2],"纵向2")
}
- 思路就是,先定一个二维数组,初始值都是0
- 然后按照条件,顺时针循环,总共
(n >> 1) + 1
层 - 循环的下标于 层数有关!
1.1.4. 代码:
点击显示
func generateMatrix(n int) [][]int {
arr := make([][]int,n)
for i:=0;i<n;i++ {
arrH := make([]int,n)
arr[i] = arrH
}
var s int
s = 1
for l:=0;l< n>>1 + 1;l++ {
width := n-l
height := n-l
for i:=0+l;i<width;i++ {
arr[0+l][i] = s
s++
}
for i:=1+l;i<height;i++ {
arr[i][width-1] = s
s++
}
for i:=width-2;i>=0+l;i-- {
arr[width-1][i] = s
s++
}
for i:=width-2;i>0+l;i-- {
arr[i][l]= s
s++
}
}
return arr
}