【剑指Offer】29.顺时针打印矩阵(JS实现)

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

题目解答(递归)

var spiralOrder = function(matrix) {
    // 矩阵的行数
    var rows = matrix.length;
    // 最终遍历的结果
    var result = [];
    if(matrix.length !=0){
        // 矩阵的列数
        var columns = matrix[0].length;
        // 矩阵元素的个数
        var matrixLength = rows*columns;
        printByCircle(matrix,result,rows,columns,0,0,matrixLength);
    }
    return result;
};
/**
 *  printByCircle()的参数分别是矩阵、遍历结果、未遍历的矩阵的最大行,未遍历的矩阵的最大列,未遍历的矩阵
 *  的开始元素行下标和列下标,未遍历的元素个数
 *	如果未遍历的元素个数为0,则意味着遍历结束,通常遍历结束是在遍历某行或列之前。
 */
var printByCircle = function(matrix,result,rows,columns,row,column,matrixLength){  
    if(matrixLength <= 0){
        return ;
    }
    // 从左往右打印一行
    for(var j=column;j<columns;j++){
        result.push(matrix[row][j]);
        matrixLength--;
    }
    // 从上往下打印一列
    if(matrixLength <= 0){
        return ;
    }
    for(var i=row+1;i<rows;i++){
        result.push(matrix[i][columns-1]);
        matrixLength--;
    }
    // 从右往左打印一行
    if(matrixLength <= 0){
        return ;
    }
    for(var j=columns-2;j>column-1;j--){
        result.push(matrix[rows-1][j]);
        matrixLength--;
    }
    // 从下往上打印一列
    if(matrixLength <= 0){
        return ;
    }
    for(var i=rows-2;i>row;i--){
        result.push(matrix[i][column]);
        matrixLength--;
    }
    printByCircle(matrix,result,rows-1,columns-1,row+1,column+1,matrixLength);
}

算法执行的结果:
在这里插入图片描述


版权声明:本文为weixin_39006917原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。