题目
Python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
m, n = len(matrix), len(matrix[0])
left_m, left_n = 0, 0
right_m, right_n = m-1, n-1
while left_m <= right_m and left_n <= right_n:
for i in range(left_n, right_n+1):
res.append(matrix[left_m][i])
for i in range(left_m+1, right_m):
res.append(matrix[i][right_n])
if left_m < right_m:
for i in range(right_n, left_n-1, -1):
res.append(matrix[right_m][i])
if left_n < right_n:
for i in range(right_m-1, left_m, -1):
res.append(matrix[i][left_n])
left_m += 1
left_n += 1
right_m -= 1
right_n -= 1
return res
Java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
int leftUpM = 0, leftUpN = 0, rightDownM = m - 1, rightDownN = n - 1;
List<Integer> res = new ArrayList<>();
while (leftUpM <= rightDownM && leftUpN <= rightDownN) {
for (int i = leftUpN; i <= rightDownN; ++i) {
res.add(matrix[leftUpM][i]);
}
for (int i = leftUpM + 1; i < rightDownM; ++i) {
res.add(matrix[i][rightDownN]);
}
for (int i = rightDownN; i >= leftUpN && leftUpM < rightDownM; --i) {
res.add(matrix[rightDownM][i]);
}
for (int i = rightDownM - 1; i > leftUpM && leftUpN < rightDownN; --i) {
res.add(matrix[i][leftUpN]);
}
++leftUpM;
++leftUpN;
--rightDownM;
--rightDownN;
}
return res;
}
}