问题描述
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路
边界法
用四个变量rowBegin,rowEnd,colBegin,colEnd
来控制遍历的边界,然后用x,y配合遍历
CPP
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() == 0)return {};
vector<int> ans;
int row = matrix.size();
int col = matrix[0].size();
int rowBegin = 0,colBegin = 0;
int rowEnd = row - 1,colEnd = col - 1;
int x = 0,y = 0;
int total = row * col;
int num = 0;
while(num < total)
{
for(;x <= colEnd && num < total;x++)
{
ans.push_back(matrix[rowBegin][x]);
num++;
}
rowBegin++;
y = rowBegin;
for(;y <= rowEnd && num < total;y++)
{
ans.push_back(matrix[y][colEnd]);
num++;
}
colEnd--;
x = colEnd;
for(;x >= colBegin && num < total;x--)
{
ans.push_back(matrix[rowEnd][x]);
num++;
}
rowEnd--;
y = rowEnd;
for(;y >= rowBegin && num < total;y--)
{
ans.push_back(matrix[y][colBegin]);
num++;
}
colBegin++;
x = colBegin;
}
return ans;
}
};
GO
func spiralOrder(matrix [][]int) []int {
ans := make([]int,0)
if len(matrix) == 0{
return ans
}
row := len(matrix)
col := len(matrix[0])
rowBegin,rowEnd := 0, row-1
colBegin,colEnd := 0, col-1
x,y := 0,0
num,total := 0, row * col
for num < total{
for ;x <= colEnd && num < total;x++{
ans = append(ans,matrix[rowBegin][x])
num++
}
rowBegin++
y = rowBegin
for ;y <= rowEnd && num < total;y++{
ans = append(ans,matrix[y][colEnd])
num++
}
colEnd--
x = colEnd
for ;x >= colBegin && num < total;x--{
ans = append(ans,matrix[rowEnd][x])
num++
}
rowEnd--
y = rowEnd
for ;y >= rowBegin && num < total;y--{
ans = append(ans,matrix[y][colBegin])
num++
}
colBegin++
x = colBegin
}
return ans
}