题目
顺时针打印矩阵
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
解法1
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if(matrix == null || matrix.length == 0) return res;
int R = matrix.length,C = matrix[0].length;
boolean[][] seen = new boolean[R][C];
//di 为方向,共4个方向。当 di = 0 时,dr[di],dc[di]的意思是行不变,列加1,即方向为右;同理,di = 2时表示方向为左。
//dr dc的设计是顺时针方向,从右开始,4个方向为右,下,左,上
int[] dr = new int[]{0,1,0,-1};
int[] dc = new int[]{1,0,-1,0};
int r = 0,c = 0,di = 0;
for(int i = 0;i < R * C;i++){
res.add(matrix[r][c]);
seen[r][c] = true;
int cr = r + dr[di];//下一步可能移动的位置的行
int cc = c + dc[di];//下一步可能移动的位置的列
if(cr >= 0 && cr < R && cc >= 0 && cc < C && seen[cr][cc] == false){
r = cr;
c = cc;
}
else{
di = (di + 1) % 4;
r += dr[di];//一定在矩阵中,没必要进行判断
c += dc[di];//同上
}
}
return res;
}
此方法简单,但是空间复杂度较高
解法2
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
if(matrix == null || matrix.length == 0) return null;
ArrayList<Integer> resList = new ArrayList<Integer>();
printCircle(matrix, 0, matrix.length - 1, 0, matrix[0].length - 1, resList);
return resList;
}
private void printCircle(int[][] matrix, int startRow, int endRow, int startCol, int endCol, ArrayList<Integer> list){
int i = 0;
if(startRow < endRow && startCol < endCol){
for(i = startCol;i <= endCol;i++) list.add(matrix[startRow][i]);
for(i = startRow + 1;i <= endRow - 1;i++) list.add(matrix[i][endCol]);
for(i = endCol;i >= startCol;i--) list.add(matrix[endRow][i]);
for(i = endRow - 1;i >= startRow + 1;i--) list.add(matrix[i][startCol]);
printCircle(matrix, startRow + 1, endRow - 1, startCol + 1, endCol - 1, list);
}
else if(startRow == endRow && startCol < endCol)
for(i = startCol;i <= endCol;i++) list.add(matrix[startRow][i]);
else if(startCol == endCol && startRow < endRow)
for(i = startRow;i <= endRow;i++) list.add(matrix[i][startCol]);
else if(startCol == endCol && startRow == endRow) list.add(matrix[startRow][startCol]);
else return;
}
}
注:算法题目及解法来源于 leetcode