剑指offer(java实现)第19题“顺时针打印矩阵”-牛客网

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zm13007310400/article/details/81273654

题目描述

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

时间限制:1秒 空间限制:32768K 热度指数:287541

解答:(是参照的《剑指offer》上的答案)

import java.util.ArrayList;
public class Solution {//思路:这一题我没有写出来,是参考了《剑指offer 第二版》上的答案才写出来的

    public ArrayList<Integer> printMatrix(int [][] matrix) {
        if (null == matrix) {
            return null;
        }
        ArrayList<Integer> list = new ArrayList<>();
        int rows = matrix.length;
        int columns = matrix[0].length;
        int start = 0;
        while(rows > start*2 && columns > start*2){//书上是说:每一圈的左上角的坐标的行标和列标总是相同,且如果有新的循环,那么新开始的那圈的起点总是满足:矩阵的行>新
            //循环的起点的(行标/列标)*2、矩阵的列>新循环的起点的(行标/列标)*2
            printMatrixInCircle(matrix, rows, columns, start, list);
            ++start;
        }
        return list;
    }
    public void printMatrixInCircle(int [][] matrix, int rows, int columns, int start, ArrayList<Integer> list){
        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]);
            }
        }
        
        // 从下到上打印一列
        if (start < endX && start < endY-1) {
            for(int i = endY-1; i >= start+1; --i) {
                list.add(matrix[i][start]);
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/zm13007310400/article/details/81273654
今日推荐