剑指Offer第29题-顺时针旋转矩阵

392 阅读2分钟

这是我参与8月更文挑战的第10天,活动详情查看: 8月更文挑战

题干

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
 输出:[1,2,3,6,9,8,7,4,5]

示例 2:

 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解法:

看到这道题时直呼好家伙,这题也配归为简单题?力扣分类简直骚的不要。

顺时针打印二维数组,首先我们画出一个数组:

img

我们首先需要定义四个指针变量分别来表示我们横行位置Top、横行位置Bottom、竖行位置Left、竖行位置Right。

  • 当我们遍历完第一行时,Top下移
  • 接着来遍历右边竖行,遍历结束后Right左移
  • 接着遍历最后一行,遍历结束后Bottom上移
  • 接着遍历左边竖行,遍历结束后Left右移

我们循环结束的条件分别是,当我们Top>Bottom或Right<Left或Bottom>Top或Left>Right时都可以证明我们的循环结束了

代码实现:

 /**
  * @param {number[][]} matrix
  * @return {number[]}
  */
 var spiralOrder = function (matrix) {
     if (matrix.length == 0) return []
     let left = 0;
     let top = 0;
     let right = matrix[0].length - 1;
     let bottom = matrix.length - 1
     let res = [];
     while (true) {
         for (let i = left; i <=right; i++) {
             res.push(matrix[top][i]);
         }
         top += 1;
         if (top > bottom) break
 ​
         for (let i = top; i <= bottom; i++) {
             res.push(matrix[i][right]);
         }
         right -= 1;
         
         if (right < left) break
 ​
         for (let i = right; i >= left; i--) {
             res.push(matrix[bottom][i]);
         }
         bottom -= 1;
         if (bottom < top) break
 ​
         for (let i = bottom; i >=top; i--) {
             res.push(matrix[i][left]);
         }
         left += 1;
         if (left > right) break
     }
     return res
 };

简单的分析以下代码:

在循环中我们按照我们分析的顺序来一次遍历每一行或者每一列的数据,将得到的数据push到新的数组中,并且每一次遍历结束时将我们本位置的指针做出相应的移动,一旦遇到我们的结束条件就直接跳出循环,这说明我们此可已经遍历完了整个二维矩阵