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;
};
网友评论