美文网首页
54&59. Spiral Matrix

54&59. Spiral Matrix

作者: exialym | 来源:发表于2016-11-03 10:15 被阅读17次

59螺旋顺序读取矩阵

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]
You should return [1,2,3,6,9,8,7,4,5].
顺时针螺旋遍历一个矩阵。
研究一下我们会发现,我们走的方向将是←,↓,→,↑。。。循环
每个方向走的步数,以上面的为例。水平为3,2,1;竖直为2,1
我们按照这个规律去遍历矩阵,一开始我想的是一个大循环里套4个小循环,不过那样太麻烦了。
在网上看到了别人简洁的解法,使用一个数组来保存方向信息,一个数组来保存步数信息,一个标志来判断当前方向状态。

var spiralOrder = function(matrix) {
    var res = [];
    var nr = matrix.length;     if (nr === 0) return res;
    var nc = matrix[0].length;  if (nc === 0) return res;
     //方向标识,0左,1下,2右,3上
    var iDir = 0;   
    //方向数组,代表着在该方向上矩阵下标的变化
    var dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    //步数数组,代表着当前方向上一共该走几步
    var nSteps = [nc, nr-1];
    //初始列下标
    var ir = 0;
    //初始行下标
    var ic = -1;    
    //iDir模2可以判断当前是水平还是竖直
    //从步数数组中找出当前方向应该走多少步
    while (nSteps[iDir%2]) {
        for (var i = 0; i < nSteps[iDir%2]; ++i) {
            //利用iDir从方向数组中取出该走的方向
            ir += dirs[iDir][0]; 
            ic += dirs[iDir][1];
            res.push(matrix[ir][ic]);
        }
        //当前方向下次少走一步
        nSteps[iDir%2]--;
        //步数标识更新
        iDir = (iDir + 1) % 4;
    }
    return res;
};

54螺旋顺序生成矩阵

Given an integer n, generate a square matrix filled with elements from 1 to n2
in spiral order.
For example,Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
利用上面的思想,很快就有了答案

var generateMatrix = function(n) {
    var res = [];
     //方向标识,0左,1下,2右,3上
    var iDir = 0;   
    //方向数组,代表着在该方向上矩阵下标的变化
    var dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
    //步数数组,代表着当前方向上一共该走几步
    var nSteps = [n, n-1];
    //初始列下标
    var ir = 0;
    //初始行下标
    var ic = -1;    
    //iDir模2可以判断当前是水平还是竖直
    //从步数数组中找出当前方向应该走多少步
    var num = 1;
    while (nSteps[iDir%2]) {
        for (var i = 0; i < nSteps[iDir%2]; ++i) {
            //利用iDir从方向数组中取出该走的方向
            ir += dirs[iDir][0]; 
            ic += dirs[iDir][1];
            if (!res[ir])
                res[ir] = [];
            res[ir][ic] = num++;
        }
        //当前方向下次少走一步
        nSteps[iDir%2]--;
        //步数标识更新
        iDir = (iDir + 1) % 4;
    }
    return res;
};

相关文章

网友评论

      本文标题:54&59. Spiral Matrix

      本文链接:https://www.haomeiwen.com/subject/wnpbuttx.html