当前位置: 代码迷 >> 综合 >> letcode 螺旋矩阵
  详细解决方案

letcode 螺旋矩阵

热度:87   发布时间:2023-11-18 03:12:45.0

题目描述:
给定一个包含 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]
这道题的描述很简单,就是按一定的顺序去遍历矩阵,但是遍历过程中的下标控制比较麻烦,有四种顺序,第一种是从左到右,之后从上到下,之后从右到左,之后从下到上。然后开始下一轮的遍历。首先需要计算出循环的次数,也比较简单,比如是m X n矩阵,循环次数为(Math.min(m,n)+1)/2。之后就是解决遍历中的下标问题,我们可以使用两个变量来分别记录本次循环中的矩阵大小,即第一次循环大小为m,n第二次为m-2,n-2。
代码实现:

class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> result = new ArrayList<Integer>();if(matrix==null||matrix.length<1) return result;int m = matrix.length;int n = matrix[0].length;int temp = (Math.min(m, n)+1)/2;//m,n为本次循环得矩阵大小for(int i=0;i<temp;i++,m-=2,n-=2) {//第一次从左到右for(int x=i;x<n+i;x++) {result.add(matrix[i][x]);}//第二次从上到下for(int y=i+1;y<m+i;y++) {result.add(matrix[y][i+n-1]);}//如果m或n为1则矩阵只要一列或一行,可以跳出循环if(n==1||m==1) break;//从右到左for(int x=i+n-2;x>=i;x--) {result.add(matrix[i+m-1][x]);}//从下到上for(int y=i+m-2;y>i;y--) {result.add(matrix[y][i]); }}for(Integer i:result) {System.out.print(i+"\t");}return result;}
}

特别提醒:如果需要多个循环得时候,尽量使每个循环是独立的,即不依赖于别的循环.