【剑指Offer】顺时针打印矩阵
发布日期:2022-02-10 08:55:12 浏览次数:30 分类:技术文章

本文共 1471 字,大约阅读时间需要 4 分钟。

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

思路

主要是得画图把顺序理解清楚,详细画图见书上说明。

注意三种特殊情况,即最后一圈到底是打印几次。

思路2

  1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错

思路3

转矩阵

1.吸收第一行,并将第一行从矩阵中去掉,2.将矩阵“变相转置”(这里的转置可以理解为将矩阵从地上立起来,比如矩阵是【【1,2,3】, 【4,5,6】】 将它“变相转置”(立起来)为 【【3,6】,【2,5】,【1,4】】 )3.重复以上两步,直到将第一行去掉之后矩阵为空。

代码

class Solution {public:        vector
res; vector
printMatrix(vector
> matrix) { if(matrix.size() == 0){ return res; } int rows = matrix.size(); int columns = matrix[0].size(); int start = 0; while(rows > start*2 && columns > start*2){ printMatrixCircle(matrix,start); start++; } return res; } void printMatrixCircle(vector
> matrix,int start){ int rows = matrix.size(); int columns = matrix[0].size(); int endx = columns-1-start; int endy = rows-1-start; for(int i = start;i <= endx;i++){ res.push_back(matrix[start][i]); } if(start
= start;i--){ res.push_back(matrix[endy][i]); } } if(start
= start+1;i--){ res.push_back(matrix[i][start]); } } }};

 

转载地址:https://blog.csdn.net/hanmin822/article/details/105526976 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【剑指Offer】复杂链表的复制
下一篇:【剑指Offer】数组中重复的数字

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月27日 15时54分45秒