class Solution:
def spiralOrder(self, matrix: list[list[int]]) -> list[int]:
ans = []
top, bottom, left, right = 0, len(matrix) - 1, 0, len(matrix[0]) - 1
while top <= bottom and left <= right:
for i in range(left, right): # 从左向右
if len(ans) < len(matrix) * len(matrix[0]): # 每加一个都得判断长度
ans.append(matrix[top][i])
for j in range(top, bottom): # 从上向下
if len(ans) < len(matrix) * len(matrix[0]):
ans.append(matrix[j][right])
for i in range(right, left, -1): # 从右向左
if len(ans) < len(matrix) * len(matrix[0]):
ans.append(matrix[bottom][i])
for j in range(bottom, top, -1): # 从下向上
if len(ans) < len(matrix) * len(matrix[0]):
ans.append(matrix[j][left])
top += 1
right -= 1
bottom -= 1
left += 1
# 长宽相等且为奇数的需要单独填充
if len(matrix) == len(matrix[0]) and len(matrix) % 2 ==1:
ans.append(matrix[len(matrix) // 2][len(matrix) // 2])
return ans
java写法
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
int left = 0, up = 0;
int right = matrix[0].length - 1, down = matrix.length - 1;
while (left <= right && up <= down){
for (int i = left; i < right; i++){
if (result.size() < matrix[0].length * matrix.length){
result.add(matrix[up][i]);
}
}
for (int j = up; j < down; j++){
if (result.size() < matrix[0].length * matrix.length) {
result.add(matrix[j][right]);
}
}
for (int i = right; i > left; i--){
if (result.size() < matrix[0].length * matrix.length) {
result.add(matrix[down][i]);
}
}
for (int j = down; j > up; j--){
if (result.size() < matrix[0].length * matrix.length) {
result.add(matrix[j][left]);
}
}
up += 1;
right -= 1;
down -= 1;
left += 1;
}
if (matrix[0].length % 2 != 0 && matrix[0].length == matrix.length){
result.add(matrix[matrix[0].length / 2][matrix.length / 2]);
}
return result;
}