54. 螺旋矩阵

54. 螺旋矩阵icon-default.png?t=N2N8https://leetcode.cn/problems/spiral-matrix/

难度中等1346

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 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]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100
/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
  [10, 11, 12],
];
var spiralOrder = function (matrix) {
  let arr = [];
  let rows = matrix.length;
  let col = matrix[0].length;
  let top = 0,
    bottom = rows - 1;
  let left = 0,
    right = col - 1; //设置左右边界
  console.log(rows, "行", col, "列");
  while (top <= bottom && right >= left) {
    for (let column = left; column <= right; column++) {
      arr.push(matrix[top][column]); //从当前这一圈的顶部添加,限制top,控制向右移动的column
    }
    for (let row = top + 1; row <= bottom; row++) {
      arr.push(matrix[row][right]); //从当前这圈的右侧添加,固定右边界限,控制从上往下读取数据的row
    }
    if (top < bottom && right > left) {
      //在左右,上下都未重合的情况下,继续下边和左边的添加
      for (let column = right - 1; column > left; column--) {
        arr.push(matrix[bottom][column]); //固定底部界限,从右向左的column读到右边界的值后,自减,向左移动,但不移动到底,留一位
      }
      for (let row = bottom; row > top; row--) {
        //从刚刚留下的位置开始,固定左边界限,控制row读取底边的值,自减,向上移动到小于top界限的位置
        arr.push(matrix[row][left]);
      }
    } //至此就完成了一个具有上下左右的一圈的读取
    left++;
    bottom--;
    top++;
    right--; //指向位置 向内收拢一圈
  }
  console.log(arr);
};
spiralOrder(matrix);

控制由外到内一层层读取,只需注意边界的限制即可

### Java 实现螺旋矩阵 为了实现一个能够按照顺时针方向遍历并打印出矩形数组中所有元素的功能,在Java中有多种方法可以达成这一目标。下面提供了一种基于边界控制的方法来完成此操作[^1]。 #### 方法概述 该方法通过定义四个变量分别表示当前处理区域的上界、下界、左界以及右界,随着每一圈数据读取完毕后调整这些边界的数值从而缩小包围范围直至整个矩阵被完全访问过为止。 #### 示例代码 以下是具体的Java程序示例: ```java public class SpiralMatrix { public static List<Integer> spiralOrder(int[][] matrix) { List<Integer> result = new ArrayList<>(); if (matrix.length == 0 || matrix[0].length == 0){ return result; } int top = 0; // 上边界 int bottom = matrix.length - 1; // 下边界 int left = 0; // 左边界 int right = matrix[0].length - 1; // 右边界 while(true){ for(int i=left;i<=right;i++)// 向右移动直到最右边 result.add(matrix[top][i]); if(++top > bottom) break; for(int i=top;i<=bottom;i++)// 向下移动直到最底端 result.add(matrix[i][right]); if(--right < left) break; for(int i=right;i>=left;i--)// 向左移动直到最左边 result.add(matrix[bottom][i]); if (--bottom < top) break; for(int i=bottom;i>=top;i--)// 向上移动到起始位置上方一格 result.add(matrix[i][left]); if (++left > right) break; } return result; } } ``` 这段代码实现了对于任意大小(`m×n`)输入矩阵的顺时针顺序遍历,并将结果存储在一个列表当中返回给调用者[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值