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].
順時針螺旋遍歷一個矩陣虎敦。
研究一下我們會發(fā)現(xiàn),我們走的方向將是←,↓损趋,→将饺,↑贸街。沼琉。娃承。循環(huán)
每個方向走的步數(shù)奏夫,以上面的為例。水平為3,2,1历筝;豎直為2,1
我們按照這個規(guī)律去遍歷矩陣酗昼,一開始我想的是一個大循環(huán)里套4個小循環(huán),不過那樣太麻煩了梳猪。
在網(wǎng)上看到了別人簡潔的解法麻削,使用一個數(shù)組來保存方向信息,一個數(shù)組來保存步數(shù)信息,一個標志來判斷當前方向狀態(tài)呛哟。
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;
//方向數(shù)組俺祠,代表著在該方向上矩陣下標的變化
var dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
//步數(shù)數(shù)組公给,代表著當前方向上一共該走幾步
var nSteps = [nc, nr-1];
//初始列下標
var ir = 0;
//初始行下標
var ic = -1;
//iDir模2可以判斷當前是水平還是豎直
//從步數(shù)數(shù)組中找出當前方向應該走多少步
while (nSteps[iDir%2]) {
for (var i = 0; i < nSteps[iDir%2]; ++i) {
//利用iDir從方向數(shù)組中取出該走的方向
ir += dirs[iDir][0];
ic += dirs[iDir][1];
res.push(matrix[ir][ic]);
}
//當前方向下次少走一步
nSteps[iDir%2]--;
//步數(shù)標識更新
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;
//方向數(shù)組腿准,代表著在該方向上矩陣下標的變化
var dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]];
//步數(shù)數(shù)組,代表著當前方向上一共該走幾步
var nSteps = [n, n-1];
//初始列下標
var ir = 0;
//初始行下標
var ic = -1;
//iDir模2可以判斷當前是水平還是豎直
//從步數(shù)數(shù)組中找出當前方向應該走多少步
var num = 1;
while (nSteps[iDir%2]) {
for (var i = 0; i < nSteps[iDir%2]; ++i) {
//利用iDir從方向數(shù)組中取出該走的方向
ir += dirs[iDir][0];
ic += dirs[iDir][1];
if (!res[ir])
res[ir] = [];
res[ir][ic] = num++;
}
//當前方向下次少走一步
nSteps[iDir%2]--;
//步數(shù)標識更新
iDir = (iDir + 1) % 4;
}
return res;
};