JZ19 顺时针打印矩阵

JZ19 顺时针打印矩阵

描述

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

返回值:

[1,2,4,3]

解析

本来吧,这种题也没什么特色,不想特意记一下。不过想了半天也没想出来,看了一眼题解恍然大悟,这种方法属实通俗易懂方便实现,所以还是记录了一下!

顺时针打印矩阵,即按照从左到右从上到下从右到左从下到上的顺序一直循环,直到打印完整个数组。这就出现了两个问题:如何按照顺序打印何时停止

核心思想为:已经打印过的一条路线后面就不需要了。定义四个变量,up 代表数组上边界、down 代表数组下边界、left 代表数组左边界、right 代表数组右边界。于是可以通过控制边界的值调整数组的大小,随着打印的进度缩小数组,最后数组缩小为不存在时(即上边界大于下边界,或左边界大于右边界),说明输出完成(何时停止)。

打印的顺序为:首先从左到右,即 up 不变,变量 ileft 增加到 right,当前的 up 边界就打印完了,将 up 加一,即上边界移动到下一行;再到从上到下,即 right 不变,变量 iup 增加到 down,当前的 right 边界就打印完了,将 right 减一,即右边界移动到左一行;剩下的从左到右、从下到上同理。

代码清单

public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> result =  new ArrayList<Integer>();
        if(matrix == null)
            return result;
        // 数组上边界
        int up = 0;
        // 数组下边界(行)
        int down = matrix.length-1;
        // 数组左边界
        int left = 0;
        // 数组右边界(列)
        int right = matrix[0].length-1;
        
        while( true ){
            for(int i=left;i<=right;i++){
                result.add(matrix[up][i]);
            }
            up++;
            if(up>down)
                break;
            for(int i=up;i<=down;i++){
                result.add(matrix[i][right]);
            }
            right--;
            if(left>right)
                break;
            for(int i=right;i>=left;i--){
                result.add(matrix[down][i]);
            }
            down--;
            if(up>down)
                break;
            for(int i=down;i>=up;i--){
                result.add(matrix[i][left]);
            }
            left++;
            if(left>right)
                break;
        }
        
        return result;
    }
}

总结

对数组的操作属实头大,不过这种控制遍历数组走向的题目还是挺多见的,还是比较有思考意义的。

上一篇:12-2 js基础


下一篇:「Namori Grundy」题解