螺旋矩阵。题意是给一个二维数组,请你螺旋遍历input,输出一个一维数组记录螺旋遍历的结果。例子,
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
这个题我没有什么比较巧妙的思路,只能照着遍历的方式去实现了代码,按照右 - 下 - 左 - 上的顺序去遍历。这个题做的时候需要用几个变量去记录二维数组坐标的边界,同时记得当每一行/列遍历完了之后,边界值需要减1因为遍历的时候每一圈的size都在减小。
时间O(m * n)
空间O(n) - 输出是一个一维数组
1 /** 2 * @param {number[][]} matrix 3 * @return {number[]} 4 */ 5 var spiralOrder = function (matrix) { 6 let res = []; 7 if (matrix.length === 0) { 8 return res; 9 } 10 let rowBegin = 0; 11 let rowEnd = matrix.length - 1; 12 let colBegin = 0; 13 let colEnd = matrix[0].length - 1; 14 15 while (colBegin <= colEnd && rowBegin <= rowEnd) { 16 // right 17 for (var i = colBegin; i <= colEnd; i++) { 18 res.push(matrix[rowBegin][i]); 19 } 20 rowBegin++; 21 22 // down 23 for (var i = rowBegin; i <= rowEnd; i++) { 24 res.push(matrix[i][colEnd]); 25 } 26 colEnd--; 27 28 // left 29 if (rowBegin <= rowEnd) { 30 for (var i = colEnd; i >= colBegin; i--) { 31 res.push(matrix[rowEnd][i]); 32 } 33 } 34 rowEnd--; 35 36 // up 37 if (colBegin <= colEnd) { 38 for (var i = rowEnd; i >= rowBegin; i--) { 39 res.push(matrix[i][colBegin]); 40 } 41 } 42 colBegin++; 43 } 44 return res; 45 };
来源:https://www.cnblogs.com/aaronliu1991/p/12306139.html