【剑指offer】19 顺时针打印矩阵
题目地址:顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
题目示例
输入:
[[1,2],[3,4]]
返回值:
[1,2,4,3]
解法分析
从外向里一圈一圈地打印,可以理解为边界不断向内收缩的过程,步骤可以分解为:
1.打印上边界,上边界向内(下)收缩;
2.打印右边界,右边界向内(左)收缩;
3.打印下边界,下边界向内(上)收缩;
4.打印左边界,左边界向内(右)收缩;
5.循环上述步骤直到满足边界条件。
要注意收缩后判断上下、左右边界是否重合,以此作为跳出循环的边界条件。
代码
1 function printMatrix(matrix) 2 { 3 // write code here 4 var arr = []; 5 var top = 0; 6 var right = matrix[0].length - 1; 7 var bottom = matrix.length - 1; 8 var left = 0; 9 if(matrix === null || matrix.length === 0 || matrix[0].length ===0) return arr; 10 while(true){ 11 for(let col = left; col <= right; col++){ 12 arr.push(matrix[top][col]); 13 } 14 top++; 15 if(top > bottom)break; 16 for(let row = top; row <= bottom; row++){ 17 arr.push(matrix[row][right]); 18 } 19 right--; 20 if(right < left)break; 21 for(let col = right; col >= left; col--){ 22 arr.push(matrix[bottom][col]); 23 } 24 bottom--; 25 if(bottom < top)break; 26 for(let row = bottom; row >= top; row--){ 27 arr.push(matrix[row][left]); 28 } 29 left++; 30 if(left > right)break; 31 } 32 return arr; 33 }
执行结果