Merge pull request #2545 from markwang1992/54-spiralOrder

54.螺旋矩阵增加Go版本
This commit is contained in:
程序员Carl
2024-05-29 11:11:23 +08:00
committed by GitHub

View File

@ -348,6 +348,82 @@ class Solution(object):
return print_list return print_list
``` ```
### Go
```go
func spiralOrder(matrix [][]int) []int {
rows := len(matrix)
if rows == 0 {
return []int{}
}
columns := len(matrix[0])
if columns == 0 {
return []int{}
}
res := make([]int, rows * columns)
startx, starty := 0, 0 // 定义每循环一个圈的起始位置
loop := min(rows, columns) / 2
mid := min(rows, columns) / 2
count := 0 // 用来给矩阵中每一个空格赋值
offset := 1 // 每一圈循环,需要控制每一条边遍历的长度
for loop > 0 {
i, j := startx, starty
// 模拟填充上行从左到右(左闭右开)
for ; j < starty + columns - offset; j++ {
res[count] = matrix[startx][j]
count++
}
// 模拟填充右列从上到下(左闭右开)
for ; i < startx + rows - offset; i++ {
res[count] = matrix[i][j]
count++
}
// 模拟填充下行从右到左(左闭右开)
for ; j > starty; j-- {
res[count] = matrix[i][j]
count++
}
// 模拟填充左列从下到上(左闭右开)
for ; i > startx; i-- {
res[count] = matrix[i][starty]
count++
}
// 第二圈开始的时候起始位置要各自加1 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
startx++
starty++
// offset 控制每一圈里每一条边遍历的长度
offset += 2
loop--
}
// 如果min(rows, columns)为奇数的话,需要单独给矩阵最中间的位置赋值
if min(rows, columns) % 2 == 1 {
if rows > columns {
for i := mid; i < mid + rows - columns + 1; i++ {
res[count] = matrix[i][mid]
count++
}
} else {
for i := mid; i < mid + columns - rows + 1; i++ {
res[count] = matrix[mid][i]
count++
}
}
}
return res
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
```
<p align="center"> <p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank"> <a href="https://programmercarl.com/other/kstar.html" target="_blank">