54&59. Spiral Matrix

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;
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,790评论 0 33
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 10,083评论 0 23
  • 第一章 投资就是要用现金流思维(奶牛思维) 1.当你不知道投资什么的时候,最好的投资就是投资资金的脑袋; 2.最坏...
    guoke1937阅读 708评论 0 0
  • 2009-9-19 伊萨贝尔 法~伊莱娜 内米洛夫斯基 作者:犹太裔法国女作家,死于纳粹集中营。古典主义作者。文笔...
    豆芽地阅读 246评论 0 0
  • 一切可以妥当的一定会妥当!准备迎接奇迹!简单想,认真行! 一、发掘空性 今年的考核不知道为啥这么早领导就发邮件给我...
    belivePossible阅读 135评论 0 0