剑指Offer_19_顺时针打印矩阵

来源:互联网 发布:python time 加减 编辑:程序博客网 时间:2024/05/16 07:52

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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]);            }        }    }}
0 0
原创粉丝点击