题目
力扣题目链接 ,本题与 剑指 Offer 29. 顺时针打印矩阵 相同。
给你一个 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
思路
总体上来说,本题与 54. 螺旋矩阵 几乎是一样的,唯一一个区别在于:
- 54. 螺旋矩阵 是给定一个 n ,矩阵中的数值区间为 [1, n]
- 本题的矩阵中数字没有规律
不过不影响,同样可以使用四边界法解决。
答案
Java
class Solution {public List<Integer> spiralOrder(int[][] matrix) {// 特例if (matrix.length == 0 || matrix[0].length == 0) {return new ArrayList<Integer>(0);}// 获取矩阵行列数int row = matrix.length, column = matrix[0].length;// 申请固定空间大小的数组作为答案的容器List<Integer> list = new ArrayList<>(row * column);// 设定四边界int top = 0, bottom = row - 1, left = 0, right = column - 1;// 计算循环次数int count = row * column;while (count >= 1) {// 从左界到右界(从矩阵左上角填到右上角)for (int i = left; i <= right && count >= 1; i++) {list.add(matrix[top][i]);count--;}// 上界向下收缩1格, 因为矩阵的上侧已经处理完成top++;// 从上界到下界(从矩阵右上角填到右下角)for (int i = top; i <= bottom && count >= 1; i++) {list.add(matrix[i][right]);count--;}// 右界向左移动1格, 因为矩阵的右侧已经处理完成right--;// 从右界到左界(从矩阵右下角填到左下角)for (int i = right; i >= left && count >= 1; i--) {list.add(matrix[bottom][i]);count--;}// 下界向上移动1格, 因为矩阵的下侧已经处理完成bottom--;// 从下界到上界(从矩阵左下角填到左上角)for (int i = bottom; i >= top && count >= 1; i--) {list.add(matrix[i][left]);count--;}// 左界向右移动1格, 因为矩阵的左侧已经处理完成left++;}return list;}}
