一 题目
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
二 分析
medium级别,求螺旋式输出M*N矩阵的内容。
所谓螺旋式就容易理解,顺时针嘛,处理4个边,分别方向就是从左到右遍历行,从上到下遍历列,再从右到左遍历行,再从下往上遍历列。
因此定义了上下左右四个变量表示四个角。每次循环,都对应加或者减。遍历前面判断res是否满了。
代码如下:
public static void main(String[] args) {
int[][] matrix1={
{7},
{9},
{6}
};
List<Integer> res1 = spiralOrder(matrix1);
System.out.println(JSON.toJSON( res1 ));
int[][] matrix={
{1,2,3},
{4,5,6},
{7,8,9}
};
List<Integer> res = spiralOrder(matrix);
System.out.println(JSON.toJSON( res ));
}
public static List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
//conner case
if(matrix == null || matrix.length == 0){
return res;
}
//行
int m = matrix.length;
//列
int n = matrix[0].length;
//定义边界四个角
int left=0;int right= n-1;int up =0; int down= m-1;
while(res.size() < m*n ){
if(up<m){
//从左往右:遍历列
for(int i= left;i<=right;i++ ){
res.add( matrix[up][i]);
}
up++;
}
//从上往下:遍历行
if(res.size() < m*n){
for(int i=up;i<=down;i++){
res.add( matrix[i][right]);
}
right--;
}
//从右往左:遍历列
if( res.size() < m*n){
for(int i= right;i>=left;i--){
res.add(matrix[ down][i ] );
}
down--;
}
//从下到上:遍历行
if(res.size() < m*n){
for(int i=down;i>=up;i--){
res.add(matrix[ i][left] );
}
left++;
}
}
return res;
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Spiral Matrix.
Memory Usage: 34.7 MB, less than 100.00% of Java online submissions for Spiral Matrix.
时间复杂度:O (M*N)