矩阵问题
矩阵按层打印
- 问题描述:
- 给定矩阵:
1 2 3 4
5 6 7 8
9 10 11 12 - 打印结果 1 2 3 4 8 12 11 10 9 5 6 7
- 给定矩阵:
- 思路:
- 每次只打印一框, 直到打印结束
- 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40func spiralOrderPrint(arr [][]int) {
if arr == nil || len(arr) < 1 || len(arr[0]) < 1 {
return
}
LT, RT, LB, RB := 0, 0, len(arr) - 1, len(arr[0]) - 1
for LT <= LB && RT <= RB {
printEdge(arr, LT, RT, LB, RB)
LT++
RT++
LB--
RB--
}
}
func printEdge(arr [][]int, LT, RT, LB, RB int) {
if LT == LB {
for ; RT <= RB; RT++ {
fmt.Println(arr[LT][RT])
}
return
}
if RT == RB {
for ; LT <= LB; LT++ {
fmt.Println(arr[LT][RT])
}
return
}
for i := RT; i < RB; i++ {
fmt.Println(arr[LT][i])
}
for i := LT; i < LB; i++ {
fmt.Println(arr[i][RB])
}
for i := RB; i > RT; i-- {
fmt.Println(arr[LB][i])
}
for i := LB; i > LT; i-- {
fmt.Println(arr[i][RT])
}
}
正方形矩阵顺时针旋转90度
- 问题描述
- 给定矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16 - 处理后的矩阵
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
- 给定矩阵:
- 思路:
- 每次只旋转一框, 直到旋转完成
- 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22func rotateMatrix(arr [][]int) {
if arr == nil || len(arr) == 0 || len(arr[0]) == 0 || len(arr) != len(arr[0]) {
return
}
LT, RT, LB, RB := 0, 0, len(arr) - 1, len(arr[0]) - 1
for LT < LB && RT < RB {
rotateEdge(arr, LT, RT, LB, RB)
LT++
RT++
LB--
RB--
}
}
func rotateEdge(arr [][]int, LT, RT, LB, RB int) {
if LT == LB || RT == RB {
return
}
for i := 0; i < RB - RT; i++] {
arr[LT + i][RB], arr[LB][RB - i], arr[LB - i][RT], arr[LT][RT + i] = arr[LT][RT + i], arr[LT + i][RB], arr[LB][RB - i], arr[LB - i][RT]
}
}
之字型打印矩阵
- 问题描述
- 给定矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16 - 打印结果:
1
2 5
9 6 3
4 7 10 13
14 11 8
12 15
16
- 给定矩阵:
- 思路:
- 每次只打印一条线, 直到打印完成
- 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36func MatrixZigZag(arr [][]int) {
if arr == nil || len(arr) == 0 || len(arr[0]) == 0 {
return
}
P1L, P1R, P2L, P2R := 0, 0, 0, 0
flag := false
for P1L < len(arr) && P2L < len(arr) && P1R < len(arr[0]) && P2R < len(arr[0]) {
printOneLine(arr, P1L, P1R, P2L, P2R, flag)
flag = !flag
if P1R != len(arr[0]) - 1 {
P1R++
} else {
P1L++
}
if P2L != len(arr) - 1 {
P2L++
} else {
P2R++
}
}
}
func printOneLine(arr [][]int, P1L, P1R, P2L, P2R int, P1ToP2 bool) {
for P1L != P2L && P1R != P2R {
if P1ToP2 {
fmt.Print(arr[P1L][P1R], " ")
P1L++
P1R--
} else {
fmt.Print(arr[P2L][P2R], " ")
P2L--
P2R++
}
}
fmt.Println(arr[P1L][P1R])
}
从一个行和列都已经排好序的二维数组中寻找指定元素是否存在
- 给定一个行和列都已经排好续的矩阵和一个数, 判断矩阵中是否有这个数
- 矩阵例:
1 3 5 7
2 6 8 10
4 9 10 12- 数: 6
- 矩阵例:
- 思路:
- 从右上往左下寻找
- 从矩阵右上角开始寻找
- 如果数小于指定的数, 向下移动
- 如果数大于指定的数, 向左移
- 从左下往右上寻找
- 从矩阵左下角开始寻找
- 如果数小于指定数, 向右移动
- 如果数大于指定数, 向上移动
- 从右上往左下寻找
- 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18func findNumInSortMatrix(arr [][]int, num int) (int, int) {
if arr == nil || len(arr) == 0 || len(arr[0]) == 0 {
return -1, -1
}
x, y := len(arr) - 1, 0
for x >= 0 && y < len(arr[0]) {
if arr[x][y] == num {
return x, y
}
if arr[x][y] > num {
x--
}
if arr[x][y] < num {
y++
}
}
return -1, -1
}