顺时针打印矩阵 --剑指offer

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

思路:

一共打印(Math.min(m,n)-1)/2+1圈  外循环是这个 circle代表当前打印第几圈了 

里边有四个循环 分别对应最上边的从左到右打印 最右边的从上往下...... 每个循环的开始和结束位置都是和circle有关 找一下规律

特殊情况:第三个循环(下边的从右向左打印)  这里可能会出现一个问题 如果最后只剩一行的话 会不会和第一个循环重复打印 所以条件m-1-circle!=circle就是解决这个问题的

m-1-circle就是当前打印的行 circle是第一个循环打印的行 只要他们两个不想等就可以打印 如果相等那就说明只有一行 那么不打印

第四个循环同理。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> result=new ArrayList<>();
       int m=matrix.length;
       int n=matrix[0].length;
       int layers=(Math.min(m,n)-1)/2+1;
        for(int circle =0;circle < layers;circle++){
            for(int j=circle;j<n-circle;j++){
                result.add(matrix[circle][j]);
            }
            for(int j=circle+1;j<m-circle;j++){
                result.add(matrix[j][n-1-circle]);
            }
            for(int j=n-2-circle;j>=circle&&(m-1-circle!=circle);j--){ 
                result.add(matrix[m-1-circle][j]);
            }
            for(int j=m-2-circle;j>=circle+1&&(n-1-circle)!=circle;j--){
                result.add(matrix[j][circle]);
            }
        }
        return result;
    }
}

 

posted @ 2020-03-05 22:51  nlw  阅读(137)  评论(0编辑  收藏  举报