美文网首页
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