leetcode 54. 螺旋矩阵

mac2026-01-10  10

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]

方法:按层模拟 从左上方开始以顺时针的顺序遍历所有元素,假设当前层左上角坐标是 (r1, c1),右下角坐标是 (r2, c2)。

首先,遍历上方的所有元素 (r1, c),按照 c = c1,…,c2 的顺序。然后遍历右侧的所有元素 (r, c2),按照 r = r1+1,…,r2 的顺序。如果这一层有四条边(也就是 r1 < r2 并且 c1 < c2 ),我们以下图所示的方式遍历下方的元素和左侧的元素。

class Solution { public List<Integer> spiralOrder(int[][] matrix) { List ans = new ArrayList(); if(matrix.length == 0) return ans; int r1 = 0, r2 = matrix.length - 1; int c1 = 0, c2 = matrix[0].length - 1; while(r1 <= r2 && c1 <= c2){ for(int c = c1; c <= c2; c++) ans.add(matrix[r1][c]); for(int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]); if(r1 < r2 && c1 < c2){ for(int c = c2 - 1; c >= c1 + 1; c--) ans.add(matrix[r2][c]); for(int r = r2; r >= r1 + 1; r--) ans.add(matrix[r][c1]); } r1++; r2--; c1++; c2--; } return ans; } }
最新回复(0)