剑指offer之面试题20:顺时针打印矩阵

题目描述

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

输入:
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.

思路:矩阵的打印从外向里,一圈圈打印,每一圈起始点为左上角:(0,0),(1,1),(2,2),…(k,k),观察发现起始点总是行列值相等。什么时候结束?比如一个4阶矩阵,起始坐标为:(0,0),(1,1),打印两圈之后就打印结束了(4<=2*2)。比如一个5阶矩阵,起始坐标为:(0,0),(1,1),(2,2),而且只打印了一个数(5>2*2)。比如一个6阶矩阵,起始坐标为:(0,0),(1,1),(2,2),最后恰好打印一圈(6>2*2)。由此可以得出,继续打印下一圈的条件是:columns>2*start&&rows>2*start
写出代码如下:

import java.util.ArrayList;
public class Solution {
    public static ArrayList<Integer> printMatrix(int [][] matrix) {
        if(matrix==null||matrix.length<=0||matrix[0].length<=0)
            return null;
        ArrayList<Integer> list=new ArrayList<Integer>();
        int start=0;
        while(matrix.length>2*start&&matrix[0].length>2*start){
            list.addAll(printMatrixCircle(matrix,matrix[0].length,matrix.length,start));
            start++;
        }
        return list;

    }

    /** * @param matrix * @param columns * @param rows * @param start */
    private static ArrayList<Integer> printMatrixCircle(int[][] matrix, int columns, int rows,
            int start) {
        int endX=columns-1-start;
        int endY=rows-1-start;
        int num=0;
        ArrayList<Integer> list=new ArrayList<Integer>();
        //print matrix startRow left-->right
        for(int i=start;i<=endX;i++){
            num=matrix[start][i];
            list.add(num);
            //System.out.print(num+" ");
        }
        //print matrix endColumn up-->down,at least two row
        if(start<endY){
            for(int i=start+1;i<=endY;i++){
                num=matrix[i][endX];
                list.add(num);
                //System.out.print(num+" ");
            }
        }
        //print matrix endRow left<--right,at least two row && two column
        if(start<endY&&start<endX){
            for(int i=endX-1;i>=start;i--){
                num=matrix[endY][i];
                list.add(num);
                //System.out.print(num+" ");
            }
        }
        //print matrix startColumn up<--down,at least three row && two column
        if(start<endY-1&&start<endX){
            for(int i=endY-1;i>=start+1;i--){
                num=matrix[i][start];
                list.add(num);
                //System.out.print(num+" ");
            }
        }
        return list;
    }
    public static void main(String[] args){
        int[][] matrix={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16,}};
        System.out.println(printMatrix(matrix).toString());
    }
}

你可能感兴趣的:(剑指offer之面试题20:顺时针打印矩阵)