Skip to main content

29 顺时针打印矩阵

leetcode-cn

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 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]

class Solution {
int index;
public int[] spiralOrder(int[][] matrix) {
index=0;
if(matrix==null || matrix.length==0 || matrix[0].length==0) return new int[]{};
int height=matrix.length;
int width=matrix[0].length;
int max=height>width?(width-1)/2:(height-1)/2;
int[] ret=new int[height*width];
for(int i=0;i<=max;++i){
printCircle(ret, matrix, i, height, width);
}
return ret;
}

private void printCircle(int[] ret, int[][] matrix, int begin, int height, int width){
int i1=begin, i2=height-i1-1;
int j1=begin, j2=width-j1-1;
for(int j=j1;j<=j2;++j){
ret[index++]=matrix[i1][j];
}
for(int i=i1+1;i<=i2;++i){
ret[index++]=matrix[i][j2];
}
if(i1<i2){
for(int j=j2-1;j>=j1;--j){
ret[index++]=matrix[i2][j];
}
}
if(j1<j2){
for(int i=i2-1;i>i1;--i){
ret[index++]=matrix[i][j1];
}
}
}
}

牛客

描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

[[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16]]

则依次打印出数字

[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]

printMatrixInCircle 用于循环一圈。定义变量 start 表示开始的位置。当 start 的 2 倍超过或等于长宽较短者说明循环完毕。

public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if(matrix==null || matrix.length==0) return list;
int start=0;
int max=Math.min(matrix.length, matrix[0].length);
while(start*2<max){
printMatrixInCircle(matrix, start, list);
++start;
}
return list;
}

private void printMatrixInCircle(int[][] matrix, int start, ArrayList<Integer> list){
int endX = matrix[0].length - 1 - start;
int endY = matrix.length -1 - start;
for(int i=start;i<=endX;++i){
list.add(matrix[start][i]);
}
for(int i=start+1;i<=endY;++i){
list.add(matrix[i][endX]);
}
if(start<endX && start<endY){
for(int i=endX-1;i>=start;--i){
list.add(matrix[endY][i]);
}
}
if(start<endX && start<endY-1){
for(int i=endY-1;i>=start+1;--i){
list.add(matrix[i][start]);
}
}

}
}