剑指offer 每日一练 - 矩阵的顺时针打印
我们定义几个参数 :columns列数 rows 行数 [startx(横坐标)starty(纵坐标)]每次循环开始的起点或者说是左上角坐标(我们可以发现startx和starty的大小是一样的) ,右下角坐标[endx,endy].
(上图为网络图片)
由上图我们可以看到主循环的边界条件应该是columns>start*2&&rows>start*2
打印函数分为四部分 1:从左到右无限制 2:上到下 start<endy 3 右到左 start<endx(一列)&&start<endy(一行)4 下到上 start<endy-1(一行)&&start<endx(一列)
从上到下不用限制因为从上到下最先执行,如果存在一列的情况是需要打印的。
下面是java的代码
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printMatrix(int [][] matrix) {
int rows = matrix.length;
int columns = matrix[0].length;
int start = 0;
while(rows>start*2&&columns>start*2){
printer(matrix,rows,columns,start);
start++;
}
return list;
}
public void printer(int[][]matrix,int rows,int columns,int start){
int endx = columns - 1 - start;
int endy= rows - 1 - start;
/*分四部分打印*/
/*左到右*/
for(int i=start;i<=endx;i++){
list.add(matrix[start][i]);
}
/* 上到下*/
if(start<endy){
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]);
}
}
/*最后是上到下因为前面三部分遍历过了所以到最后的判断条件start>endx&&start<endy-1 */
if(start<endx&&start<endy-1){
for(int i=endy-1;i>=start+1;i--){
list.add(matrix[i][start]);
}
}
}
}