您当前的位置: 首页 >  矩阵

TechGuide

暂无认证

  • 3浏览

    0关注

    176博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【每日一题】JZ19 顺时针打印矩阵

TechGuide 发布时间:2021-09-13 23:19:34 ,浏览量:3

当你的才华还撑不起你的野心时,你应该静下心去学习 。 题目描述

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

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
解题思路
  1. 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。

  2. 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。

  3. 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ; 1. 根据边界打印,即将元素按顺序添加至列表 res 尾部; 2. 边界向内收缩 11 (代表已被打印); 3. 判断是否打印完毕(边界是否相遇),若打印完毕则跳出。

  4. 返回值: 返回 res 即可。

参考代码 Java版本
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) return new int[0];
        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
        int[] res = new int[(r + 1) * (b + 1)];
        while(true) {
            for(int i = l; i  b) break;
            for(int i = t; i  --r) break;
            for(int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left.
            if(t > --b) break;
            for(int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top.
            if(++l > r) break;
        }
        return res;
    }
}
// 关注TechGuide,大厂笔经面经闪电速递!
CPP版本
class Solution 
{
public:
    vector spiralOrder(vector& matrix) 
    {
        if (matrix.empty()) return {};
        vector res;
        int l = 0;                      //左边界
        int r = matrix[0].size() - 1;   //右边界
        int t = 0;                      //上边界
        int b = matrix.size() - 1;      //下边界
        while (true)
        {
            //left -> right
            for (int i = l; i  b) break;
            //top -> bottom
            for (int i = t; i = l; i--) res.push_back(matrix[b][i]);
            if (--b  top
            for (int i = b; i >= t; i--) res.push_back(matrix[i][l]);
            if (++l > r) break;
        }
        return res;
    }
}
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍
关注
打赏
1665329535
查看更多评论
立即登录/注册

微信扫码登录

0.0363s