54. 螺旋矩阵
题目
54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
func spiralOrder(matrix [][]int) []int {
// 结果切片
ans := []int{}
// 矩阵长宽
n, m := len(matrix), len(matrix[0])
// 上下左右边界
t, b, l, r := 0, n-1, 0, m-1
// 元素个数
cnt := 1
// 获取n*m个元素
for cnt <= n*m {
// 从左到右获取上边界的元素
for i := l; i <= r; i++ {
ans = append(ans, matrix[t][i])
cnt++
}
// 上边界下移
t++
// 因为矩阵可能不为正方形,因此可能会边界重叠或越界,因此需要判断,否则可能会导致重复添加元素
// 如果上边界越过了下边界
if t > b {
break
}
// 右边界从上到下
for i := t; i <= b; i++ {
ans = append(ans, matrix[i][r])
cnt++
}
// 右边界左移
r--
// 如果右边界越过了左边界
if r < l {
break
}
// 下边界从右到左
for i := r; i >= l; i-- {
ans = append(ans, matrix[b][i])
cnt++
}
// 下边界上移
b--
// 如果下边界越过上边界
if b < t {
break
}
// 左边界从下到上
for i := b; i >= t; i-- {
ans = append(ans, matrix[i][l])
cnt++
}
// 左边界右移
l++
// 如果左边界越过了右边界
if l > r {
break
}
}
return ans
}