剑指Offer打卡29.顺时针打印矩阵

Posted 余光、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡29.顺时针打印矩阵相关的知识,希望对你有一定的参考价值。

剑指 Offer 29. 顺时针打印矩阵

JavaScript剑指Offer题解

🚀包含数组、对象、链表、堆栈、树等经典题型
☕️每天一道,轻松不累
💬详细的题目解析,收藏方便阅读
🙏在线star地址

在线阅读地址

在线阅读地址

题目描述

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

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

注意:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

模拟方向移动

  1. 模拟方向移动
  2. 确认切换方向的边界
var spiralOrder = function (matrix) 
    if (!matrix.length || !matrix[0].length) 
        return [];
    
    const rows = matrix.length; // 行数
    const columns = matrix[0].length; // 列数
    const visited = new Array(rows).fill(0).map(() => new Array(columns).fill(false)); // 复制一个相同空间的数组存储访问记录
    const total = rows * columns; // 总数
    const directions = [ x: 0, y: 1, x: 1, y: 0, x: 0, y: -1, x: -1, y: 0]; // 左->下->右->上
    let dir = 0; // 初始化方向
    let x = 0, y = 0; // 初始化坐标
    const order = new Array(total).fill(0); // 结果数组
    // 移动
    for (let i = 0; i < total; i++)  
        order[i] = matrix[x][y]; // 打印
        visited[x][y] = true; // 对应标识记录
        // 下一个坐标是否出界
        const nextx = x + directions[dir].x, 
            nexty = y + directions[dir].y;
            
        if(!(0 <= nextx && nextx < rows && 0 <= nexty && nexty < columns && !visited[nextx][nexty]))
            dir = (dir + 1) % 4; // 4个方向循环
        
        x += directions[dir].x; // 应用最新方向
        y += directions[dir].y;
    
    return order
;

写在最后

本篇是剑指Offer的第21题,俗话说好的合理的数据结构+算法才是写好代码的关键,不妨跟我一起来吧~

热门开源项目

以上是关于剑指Offer打卡29.顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡29.顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵 的 详细题解

剑指offer--29顺时针打印矩阵

剑指offer面试题 29. 顺时针打印矩阵

剑指offer面试题 29. 顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵