一、题目
给你一个 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 逐层遍历
(1)思路
根据题目要求,逐层按顺时针方向遍历矩阵中的各个元素并记录。
(2)代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length, n = matrix[0].length;
List<Integer> ans = new ArrayList<>();//输出数组
int range = m * n, left = 0, right = n - 1, top = 1, bottom = m - 1;//输出元素个数,矩阵左、右、上、下边界
int i = 0, j = 0, layer = 0;//当前输出元素坐标,所处层数
ans.add(matrix[i][j]);
while (ans.size() < range) {
//通过已处理的元素个数判断是否完成
while (j < right - layer)//向右
ans.add(matrix[i][++j]);
while (i < bottom - layer)//向下
ans.add(matrix[++i][j]);
while (ans.size() < range && j > left + layer)//若尚未完成,继续向左
ans.add(matrix[i][--j]);
while (ans.size() < range && i > top + layer)//若尚未完成,继续向上
ans.add(matrix[--i][j]);
layer++;//层数增加
}
return ans;
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :36.6 MB,在所有 Java 提交中击败了 59.51% 的用户。
三、其他
暂无。