给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 :
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
这个还是需要仔细观察,其实我们是在绕圈,绕一圈,小一圈。
class Solution { public List<Integer> spiralOrder(int[][] matrix) { //用4个数定义4个顶点。 int top = 0,left = 0,down=matrix.length-1,right=matrix[0].length-1; List<Integer> list = new ArrayList<>(); //由于是转圈,所以每走完一圈就缩小一圈,循环走完。 while (top<=down && left<=right){ //上边从左->右。 for(int i=left;i<=right;i++){ list.add(matrix[top][i]); } //右边从上->下 for(int i=top+1;i<=down;i++){ list.add(matrix[i][right]); } //需要注意:就是当top=down 或者left=right的时候,最后一圈不是圈是一条线,并且在前面两种情况已经打印,这里不能重复打印。 if(top<down && left<right) { //下边从右->左 for (int i = right - 1; i >= left; i--) { list.add(matrix[down][i]); } //左边从下->上 for (int i = down - 1; i > top; i--) { list.add(matrix[i][left]); } } //走完一圈后缩小一圈,循环。 left++; right--; top++; down--; } return list; } }
时间复杂度:O(m*n),空间复杂度:O(1)