本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目描述
螺旋矩阵
给你一个 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]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 10
- -100 <= matrix[i][j] <= 100
思路分析
按照顺时针遍历该矩阵,我们可以把矩阵的上下左右都用一个变量控制,每当遍历后,对应的值进行加或减,一直遍历下去,知道最后一个节点。该解法的时间复杂度是,空间复杂度是。
代码展示
解法一:时间复杂度是,空间复杂度是。
public List<Integer> spiralOrder(int[][] matrix) {
int n = matrix.length;
List<Integer> list = new ArrayList<>();
int top = 0;
int left = 0;
int right = matrix[0].length - 1;
int bottom = matrix.length - 1;
int numEle = matrix[0].length * matrix.length;
while(numEle > 0){
//top
for(int i = left;i <= right && numEle > 0;i++){
list.add(matrix[top][i]);
numEle--;
}
top++;
//right
for(int i = top;i <= bottom && numEle > 0;i++){
list.add(matrix[i][right]);
numEle--;
}
right--;
//bottom
for(int i = right;i >= left && numEle > 0;i--){
list.add(matrix[bottom][i]);
numEle--;
}
bottom--;
//left
for(int i = bottom;i >= top && numEle > 0;i--){
list.add(matrix[i][left]);
numEle--;
}
left++;
}
return list;
}
总结
顺时针遍历矩阵,其实思路并不难,难道在于边界的控制,处理好边界问题很重要。