和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ19 顺时针打印矩阵

原题链接-剑指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]

示例1

输入:[[1,2],[3,4]]
返回值:[1,2,4,3]

思路

如下图,要这样循环打印数组元素,可以看成 打印不同外圈的元素。因为横竖左右都有限定并且循环方向也一直在变,所以需要四个变量r1, rows, c1, cols界定循环边缘。

每一个外圈打印规则是:先➡打印上面那一行,⬇ 打印右边一列,⬅打印下面一行,⬆ 打印左边一列。每次打印完一行或者一列后,其界定变量要跟着变化(+1或者-1,为了不重复打印拐角元素)。对于下面一行和左边一列,要判断行列的界定元素不相等,否则就会重复。

在这里插入图片描述

解答

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        ArrayList<Integer> arr = new ArrayList<>();
        int r1 = 0,c1 =0;
        
        while (r1<=rows-1 && c1 <= cols-1){
            // ➡打印上面一行
            for (int j=c1;j<cols;j++){
                arr.add(matrix[r1][j]);
            }
            r1++;

            // ⬇ 打印右边一列
            for (int i = r1;i<rows;i++){
                arr.add(matrix[i][cols-1]);
            }
            rows--;

            //⬅打印下面一行
            if(r1!=rows+1) {
                for (int j = cols - 2; j >= c1; j--) {
                    arr.add(matrix[rows][j]);
                }
                cols--;
            }

            //⬆ 打印左边一列
            if(c1!=cols) {
                for (int i = rows - 1; i >= r1; i--) {
                    arr.add(matrix[i][c1]);
                }
                c1++;
            }
        }
        return arr;
    }
}
posted @ 2021-07-10 10:38  klaus08  阅读(36)  评论(0编辑  收藏  举报