题目
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 :
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
想法
@厨子哥
1、4根线,遍历一层剥掉一层。
2、每次有线移动则判断是否出界。
实现
方法1:python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
row=len(matrix)
col=len(matrix[0])
left,top=0,0
right,bottom=col-1,row-1
out=list()
while True:
for i in range(left,right+1):
out.append(matrix[top][i])
top+=1
if top>bottom:
break
for i in range(top,bottom+1):
out.append(matrix[i][right])
right-=1
if left>right:
break
for i in range(right,left-1,-1):
out.append(matrix[bottom][i])
bottom-=1
if top>bottom:
break
for i in range(bottom,top-1,-1):
out.append(matrix[i][left])
left+=1
if left>right:
break
return out
方法2:java
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int sum = m * n;
for (int i = 0; i < m; i++) {
// 加上行
for (int j = i; j < n; j++) {
list.add(matrix[i][j]);
}
// 加右列
for (int k = i + 1; k < m; k++) {
list.add(matrix[k][n - 1]);
}
// 加下行
for (int r = n - 2; r >= i; r--) {
list.add(matrix[m - 1][r]);
}
// 加左列
for (int s = m - 2; s >= i + 1; s--) {
list.add(matrix[s][i]);
}
m--;
n--;
if (m == 0 || n == 0) {
break;
}
}
List<Integer> new_list = new ArrayList<>();
for (int i = 0; i < sum; i++) {
new_list.add(list.get(i));
}
return new_list;
}
}