剑指Offer_19_顺时针打印矩阵

题目描述

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

解题思路

每次打印一圈。每次的起始位置满足(start,start),且 start * 2 要小于行数和列数。
每次打印从矩形的上边开始(在存在一圈的情况下),顺时针打印。
首先打印上边,打印完成,判断结束行是否大于start,如果大于,那么打印右边;然后判断结束列是否大于start且结束行是否大于start,如果满足,则打印下边;最后如果存在多列且行数至少有三行,则打印左边。

实现

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

    private void print(int[][] matrix, int cols, int rows, int start, ArrayList<Integer> list) {
        int endRows = rows - start - 1;
        int endCols = cols - start - 1;
        //打印上边
        for (int i = start; i < cols - start; i++){
            list.add(matrix[start][i]);
        }
        //存在多行,打印右边
        if (endRows > start){
            int j = endCols;
            for (int i = start + 1; i < rows - start; i ++){
                list.add(matrix[i][j]);
            }
        }

        //存在多行且有多列,打印下边
        if (endRows > start && endCols > start){
            int rIndex = endRows;
            for (int i = cols - start - 2; i >= start; i--){
                list.add(matrix[rIndex][i]);
            }
        }

        //存在三行以上且有多列,打印下边
        if (endRows > start + 1 && endCols > start){
            for (int i = rows - start - 2; i > start; i--){
                list.add(matrix[i][start]);
            }
        }
    }
}
posted @ 2016-08-15 17:32  峰扬迪  阅读(119)  评论(0编辑  收藏  举报