法1:边界逼近
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
//收缩边界
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix==null||matrix.length==0||matrix[0].length==0)
return list;
int up = 0;
int down = matrix.length-1;
int left = 0;
int right = matrix[0].length-1;
while(true){
//最上面一行
for(int col = left;col<=right;col++)
list.add(matrix[up][col]);
up++;
if(up > down)
break;
for(int row = up;row<=down;row++)
list.add(matrix[row][right]);
right--;
if(right < left)
break;
for(int col = right;col>=left;col--)
list.add(matrix[down][col]);
down--;
if(up > down)
break;
for(int row = down;row >=up;row--)
list.add(matrix[row][left]);
left++;
if(left>right)
break;
}
return list;
}
}
法2:
1.打印第一行,删除第一行
2.逆时针旋转矩阵90°
3.重复上述两步,直到矩阵为空。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
//打印第一行后删掉第一行
//矩阵逆时针旋转90度
//重复上述两步,直到矩阵为空
ArrayList<Integer> list = new ArrayList<Integer>();
while(true){
int n = matrix[0].length;
for(int i=0;i<n;i++)
list.add(matrix[0][i]);
matrix = delFirstRow(matrix);
if(matrix==null)
break;
matrix = rotateMatrix(matrix);
if(matrix==null)
break;
}
return list;
}
public int[][] delFirstRow(int[][] matrix){
if(matrix==null||matrix.length==0||matrix[0].length==0)
return null;
int m = matrix.length;
int n = matrix[0].length;
if(m-1<=0)
return null;
int[][] res = new int[m-1][n];
for(int i=1;i<m;i++){
for(int j=0;j<n;j++)
res[i-1][j] = matrix[i][j];
}
return res;
}
public int[][] rotateMatrix(int[][] matrix){
//逆时针旋转90度
if(matrix==null||matrix.length==0||matrix[0].length==0)
return null;
int m = matrix.length;
int n = matrix[0].length;
int[][] res = new int[n][m];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
res[n-j-1][i] = matrix[i][j];
}
}
return res;
}
}
法3:
使用标记数组来做,首先定义4个方向,右,下,左,上。沿着这四个方向依次转圈走下去。
使用数组vis当前位置是否走过。
走之前先判断,下一步是否越界或被走过,若是,则变换下一个方向,否则继续走。
import java.util.ArrayList;
public class Solution {
//定义走的方向:右,下,左,上
private final int[] dx = {0,1,0,-1};
private final int[] dy = {1,0,-1,0};
public ArrayList<Integer> printMatrix(int [][] matrix) {
int m = matrix.length,n = matrix[0].length;
//标识当前位置是否访问过
boolean[][] vis = new boolean[m][n];
ArrayList<Integer> list = new ArrayList<Integer>();
//起点x,y,起使方向
int x = 0,y=0,dir=0;
while(x >=0 && x < m && y>=0 && y < n && !vis[x][y]){
list.add(matrix[x][y]);
vis[x][y] = true;
//试着继续沿dir方向走
while(x+dx[dir] >= 0 && x + dx[dir] < m && y + dy[dir] >=0 && y + dy[dir] < n
&& !vis[x+dx[dir]][y+dy[dir]]){
x +=dx[dir];
y +=dy[dir];
list.add(matrix[x][y]);
vis[x][y]=true;
}
//走不动了则换方向
dir = (dir+1)%4;
x +=dx[dir];
y +=dy[dir];
}
return list;
}
}