【剑指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 }

 

执行结果                                   

 

posted @ 2021-01-21 11:44  月南君  阅读(59)  评论(0编辑  收藏  举报