Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5]
.
Take control of the 4 key points:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> res;
int rownum = matrix.size(), colnum = matrix.size() ? matrix[0].size() : 0, i, j;
if (rownum == 0 || colnum == 0)
return res;
int rowstart = 0, rowend = rownum - 1, colstart = 0, colend = colnum - 1;
while (rowstart <= rowend && colstart <= colend) {
for (i = colstart; i <= colend; ++i)
res.push_back(matrix[rowstart][i]);
for (i = rowstart + 1; i <= rowend; ++i)
res.push_back(matrix[i][colend]);
if (rowstart != rowend)
for (i = colend - 1; i >= colstart; --i)
res.push_back(matrix[rowend][i]);
if (colstart != colend)
for (i = rowend - 1; i > rowstart; --i)
res.push_back(matrix[i][colstart]);
++rowstart;
++colstart;
--rowend;
--colend;
}
return res;
}
};
Simple Python Version:
class Solution:
def spiralOrder(self, matrix:[[int]]) -> [int]:
if not matrix: return []
l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
while True:
for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
t += 1
if t > b: break
for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
r -= 1
if l > r: break
for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
b -= 1
if t > b: break
for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
l += 1
if l > r: break
return res