螺旋矩阵--LeetCode
题目
给你一个 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]
解决方法:按层模拟
可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。
定义矩阵的第 k 层是到最近边界距离为 k 的所有顶点。例如,下图矩阵最外层元素都是第 1 层,次外层元素都是第 2 层,剩下的元素都是第 3 层。
[[1, 1, 1, 1, 1, 1, 1],
[1, 2, 2, 2, 2, 2, 1],
[1, 2, 3, 3, 3, 2, 1],
[1, 2, 2, 2, 2, 2, 1],
[1, 1, 1, 1, 1, 1, 1]]
对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于 (top,left),右下角位于 (bottom,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为 (top,left) 到 (top,right)。
从上到下遍历右侧元素,依次为 (top+1,right) 到 (bottom,right)。
如果 left<right 且 top<bottom,则从右到左遍历下侧元素,依次为 (bottom,right−1) 到 (bottom,left+1),以及从下到上遍历左侧元素,依次为 (bottom,left) 到 (top+1,left)。
遍历完当前层的元素之后,将 left 和 top 分别增加 1,将 right 和 bottom 分别减少 1,进入下一层继续遍历,直到遍历完所有元素为止。
class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> order = new ArrayList<Integer>();//创建一个列表if(matrix == null || matrix.length == 0 || matrix[0].length == 0){//判断是否为空return order;//返回空列表}int rows = matrix.length,columns = matrix[0].length;//获取目标列表的行数、列数int left = 0,right = columns -1 ,top = 0, bottom = rows - 1;//定义左,右,上,下边界while(left <= right && top <= bottom){for(int column = left;column <= right;column++){//在上边遍历,[left,right]order.add(matrix[top][column]);}for(int row = top + 1 ;row <= bottom;row++){//在右边遍历,(top,bottom]order.add(matrix[row][right]);}if(left < right && top <bottom){//再次判断是否结束for(int column = right - 1;column >left;column--){//再下方遍历,(right,left)order.add(matrix[bottom][column]);}for(int row = bottom;row > top;row--){//在左方遍历,[bottom,top)order.add(matrix[row][left]);}}left++;//左边收缩right--;//右边界收缩top++;//上边界收缩bottom--;//下边界收缩}return order;}
}