对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(up,left),右下角位于(down,right),按照如下顺序遍历当前层的元素。
从左到右遍历上侧元素,依次为(up,left)到(up,right)。
从上到下遍历右侧元素,依次为(up+1,right+1)到(down,right)。
如果left<right且up<down,则从右到左遍历下侧元素,依次为(down,right-1)到(down,left+1),以及从下到上遍历左侧元素,依次为(down,left)到(up+1,left)。
遍历完当前层的元素之后,将up和down分别增加,将right和left分别减少,进入下一层继续遍历,直到遍历完所有元素为止。
时间复杂度:O(n * m) n,m分别表示矩阵的行数和列数
空间复杂度:O(n * m) 需要用二维数组来储存结果
优缺点:比较难实现 但是相比之下在时间和空间上比较优
import java.util.*; public class Solution { public ArrayList<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> result = new ArrayList<Integer>(); if (matrix == null || matrix.length == 0) { return result; } int left = 0; int right = matrix[0].length - 1; int up = 0; int down = matrix.length - 1; while (left <= right && up <= down) { for (int column = left; column <= right; column++) { result.add(matrix[up][column]); } for (int row = up + 1; row <= down; row++) { result.add(matrix[row][right]); } //left < down防止情况:{{3},{2}} 实际输出:[3,2,2] //up < down防止情况[[6,9,7]]实际输出[6,9,7,9] if (left < right && up < down) { for (int reverseColumn = right - 1; reverseColumn > left; reverseColumn--) { result.add(matrix[down][reverseColumn]); } for (int reverseRow = down; reverseRow > up; reverseRow--) { result.add(matrix[reverseRow][left]); } } left++; right--; up++; down--; } return result; } }