题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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.
思路
顺时针循环打印
一个大循环:由行数与列数的最小值决定
四个小循环:从左至右,从上至下,从右至左,从下至上
难点在于边界的确定
代码参考牛客网weizeier
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
int m = matrix.length;
int n = matrix[0].length;
int i=0, j=0;
//int count = m < n ? (m-1)/2+1:(n-1)/2+1;这样求,最后结果有问题,用Idea验证没有问题,?? 可能是冒号两边的加法未加括号,不确定计算顺序,一定要加括号
int count = (Math.min(n,m)-1)/2+1;//大循环次数,可以画图验证
for(int k=0; k<count; k++){
for(j=k; j<n-k; j++){
list.add(matrix[k][j]);
}
for(i=k+1; i<m-k; i++){
list.add(matrix[i][n-1-k]);
}
for(j=n-k-2;(j>=k)&&(m-k-1!=k); j--){ //(m-k-1!=k)单行
list.add(matrix[m-k-1][j]);
}
for(i=m-k-2;(i>k)&&(n-k-1!=k); i--){ //(n-k-1!=k)单列
list.add(matrix[i][k]);
}
}
return list;
}
}
同思路,另一种实现方法
链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
来源:牛客网
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int row = matrix.length-1;
int col = matrix[0].length-1;
for (int i = 0; i * 2 <= row && i * 2 <= col; i++) {
cir(list, i, row-i, col-i, matrix);
}
return list;
}
void cir(ArrayList<Integer> list, int start, int row, int col, int[][] matrix) {
for (int i = start; i <= col; i++) {
list.add(matrix[start][i]);
}
if (start == row)
return;
for (int i = start+1; i <= row; i++) {
list.add(matrix[i][col]);
}
if (start == col) {
return;
}
for (int i = col-1; i >= start; i--) {
list.add(matrix[row][i]);
}
for (int i = row-1; i >= start+1; i--) {
list.add(matrix[i][start]);
}
}