题目:螺旋矩阵
- 题号:54
- 难度:中等
- https://leetcode-cn.com/problems/spiral-matrix/
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
示例 3:
输入:
[
[1]
]
输出: [1]
示例 4:
输入:
[
[2, 3, 4],
[5, 6, 7],
[8, 9, 10],
[11, 12, 13]
]
输出: [2,3,4,7,10,13,12,11,8,5,6,9]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
实现
C# 语言
public class Solution
{
public IList<int> SpiralOrder(int[][] matrix)
{
IList<int> result = new List<int>();
if (matrix == null || matrix.Length == 0)
return result;
int start = 0;
int end1 = matrix[start].Length - 1 - start;
int end2 = matrix.Length - 1 - start;
// 只有横着的情况
if (start == end2)
{
LeftToRight(start, end1, start, matrix, result);
return result;
}
//只有竖着的情况
if (start == end1)
{
TopToBottom(start, end2, start, matrix, result);
return result;
}
while (start < end1 && start < end2)
{
LeftToRight(start, end1, start, matrix, result);
TopToBottom(start + 1, end2, end1, matrix, result);
RightToLeft(end1 - 1, start, end2, matrix, result);
BottomToTop(end2 - 1, start + 1, start, matrix, result);
start++;
end1 = matrix[start].Length - 1 - start;
end2 = matrix.Length - 1 - start;
}
// 只剩下横着的情况
if (start == end2)
{
LeftToRight(start, end1, start, matrix, result);
}
else if (start == end1)
{
//只剩下竖着的情况
TopToBottom(start, end2, start, matrix, result);
}
return result;
}
private void LeftToRight(int start, int end, int rowIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i <= end; i++)
{
lst.Add(matrix[rowIndex][i]);
}
}
private void TopToBottom(int start, int end, int colIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i <= end; i++)
{
lst.Add(matrix[i][colIndex]);
}
}
private void RightToLeft(int start, int end, int rowIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i >= end; i--)
{
lst.Add(matrix[rowIndex][i]);
}
}
private void BottomToTop(int start, int end, int colIndex, int[][] matrix, IList<int> lst)
{
for (int i = start; i >= end; i--)
{
lst.Add(matrix[i][colIndex]);
}
}
}
Python 语言
class Solution(object):
def spiralOrder(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""
result = []
if matrix is None or len(matrix) == 0:
return result
start = 0
end1 = len(matrix[start]) - 1 - start
end2 = len(matrix) - 1 - start
if start == end2:
self.LeftToRight(start, end1, start, matrix, result)
return result
if start == end1:
self.TopToBottom(start, end2, start, matrix, result)
return result
while start < end1 and start < end2:
self.LeftToRight(start, end1, start, matrix, result)
self.TopToBottom(start + 1, end2, end1, matrix, result)
self.RightToLeft(end1 - 1, start, end2, matrix, result)
self.BottomToTop(end2 - 1, start + 1, start, matrix, result)
start += 1
end1 = len(matrix[start]) - 1 - start
end2 = len(matrix) - 1 - start
if start == end2:
self.LeftToRight(start, end1, start, matrix, result)
elif start == end1:
self.TopToBottom(start, end2, start, matrix, result)
return result
def LeftToRight(self, start, end, rowIndex, matrix, lst):
for i in range(start, end + 1):
lst.append(matrix[rowIndex][i])
def TopToBottom(self, start, end, colIndex, matrix, lst):
for i in range(start, end + 1):
lst.append(matrix[i][colIndex])
def RightToLeft(self, start, end, rowIndex, matrix, lst):
for i in range(start, end - 1, -1):
lst.append(matrix[rowIndex][i])
def BottomToTop(self, start, end, colIndex, matrix, lst):
for i in range(start, end - 1, -1):
lst.append(matrix[i][colIndex])