第十九题 顺时针打印矩阵

题目描述

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

思路一

顺时针打印,也就是按这个顺序: 从左到右 → 从上到下 → 从右到左 → 从下到上 ,再接着下一轮的这个顺序。每一边都有一个起点和终点,而每一轮的相同边的起点和终点是有规律的。我们用四个变量控制它们的位置。

function printMatrix(matrix)
{// write code here// 行数和列数var row = matrix.length;var column = matrix[0].length;if (row === 0 || column === 0) return false;var newMatrix = [];// 四个位置控制位var top = left = 0, right = column - 1, bottom = row - 1;while (top <= bottom && left <= right ){// 从左到右for (var i = left; i <= right; i++) {newMatrix.push(matrix[top][i]);}// 从上到下 要注意该列的第一个数已经被上一轮遍历了,所以这一轮从top+1开始for (var i = top + 1; i <= bottom; i++) {newMatrix.push(matrix[i][right]);}// 从右到左 第一个数同理,同时还要考虑只有一行的情况,否则会重复输出这一行if (top != bottom) {for (var i = right - 1; i >= left; i--) {newMatrix.push(matrix[bottom][i]);}}// 从下到上 第一个数、最后一个数同理,且还有考虑只有一列的情况if (left != right) {for (var i = bottom - 1; i > top; i--) {newMatrix.push(matrix[i][top]);}}// 改变位置控制位,以判断是否需要进行下一轮top++; left++; right--; bottom--; }return newMatrix;
}

运行时间:13ms,占用内存:5344k

思路二

和思路一差不多的想法,但不用四个控制位,而是根据圈数来定起点

function printMatrix(matrix)
{// write code herevar row = matrix.length;var column = matrix[0].length;if (row === 0 || column === 0) return false;var newMatrix = [],i,j;// 圈数var circle = Math.floor(((row <= column ? row : column) - 1 ) / 2 )+ 1;for (i = 0; i < circle; i++) {// 从左到右 for (j = i; j < column - i; j++) {newMatrix.push(matrix[i][j]);}// 从上到下for (j = i+1; j < row-i; j++) {newMatrix.push(matrix[j][column-1-i]);}// 从右到左for (j = column-2-i; (j >= i)&&(row-1-i != i); j--) {newMatrix.push(matrix[row-1-i][j]);}// 从下到上for (j = row-2-i; (j > i)&&(column-1-i != i); j--) {newMatrix.push(matrix[j][i]);}}return newMatrix;
}

运行时间:12ms,占用内存:5420k

Q1:圈数的计算
-  2 \* 2:1 圈; 2 / 2 = 1
-  3 \* 3:2 圈; 3 / 2 = 1.5
-  4 \* 4:2 圈; 4 / 2 = 2
-  5 \* 5:3 圈; 5 / 2 = 2.5
-  6 \* 6:3 圈; 6 / 2 = 3
-  ...

也就是说,2、3向下取整能取到相同的整数(4、5,6、7同理),但圈数相同的是 3、4,那么我们将 3、4 减一再向下取整,就能得到相同的整数啦,这个整数和它们的圈数差了 1 ,所以要给它加回去。由于矩阵不一定行列相同,我们取得两者间的较小值来计算。那么,圈数就是: Math.floor(((row <= column ? row : column) - 1 ) / 2 )+ 1;

Q2:从右到左为什么 j = column-2-i

row 为行数,column 为列数,所以右下的那个值是 matrix[row-1][column-1],记得要减 1 呀。那么从右到左:

  1. 第 1 圈:i = 0;起点位置在 matrix[row-1][column-2],为什么是 - 2 ,因为前面那个数已经被上一轮遍历了好吧。
  2. 第 2 圈:i = 1;起点位置在 matrix[row-1-i][column-2-1]
  3. 第 n 圈:i = n-1; 起点位置在 matrix[row-1-(n-1)][column-2-n]

其他边的情况也是一样的,就是要记得减去已经被上一边遍历的数,再结合与圈数的关系,即可得到答案。

Q3:row-1-i != i 和 column-1-i != i 什么意思

跟思路一一样,就是要考虑矩阵只有一列或者一行的情况,否则会出现平行的边重复读(比如从左到右已经读过,从右到左会重复读)。当只有一行时,也就是上边和下边重合,根据圈数 i ,上边为 i ,下边为 row - 1 - i,一列的情况同理。

好绕…多想几遍就好了QAQ

《剑指offter》第十九题(js)相关推荐

  1. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  2. 【剑指offer】十九,数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. 《剑指offter》

    剑指offter 电子书PDF        https://github.com/YST521/JZOF.git 最近几天看博客时发现一本叫 剑指offter的书 ,里面主要是一些算法题.这些算法面 ...

  4. 剑指offter笔记

    剑指offter笔记 数组中重复的数字 二维数组中的查找 替换空格 从尾到头打印链表 递归反转链表解题思路 重建二叉树 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 矩阵中的路径 ...

  5. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

  6. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  7. Bootstrap入门(二十九)JS插件6:弹出框

    Bootstrap入门(二十九)JS插件6:弹出框 加入小覆盖的内容,像在iPad上,用于存放非主要信息 弹出框是依赖于工具提示插件的,那它也和工具提示是一样的,是需要初始化才能够使用的 首先我们引入 ...

  8. 牛客网剑指offer编程实践1-10题

    牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  9. JavaScript学习(二十九)—JS常用的事件

    JavaScript学习(二十九)-JS常用的事件 一.页面相关事件 onload事件:当页面中所有的标签都加载完成后厨房该事件,格式:window.onload <body><sc ...

最新文章

  1. js php 正则差别,正则表达式(括号)、[中括号]、{大括号}的区别小结,正则表达式小结...
  2. freeradius 启动报错Refusing to start with libssl version OpenSSL 1.0.1
  3. 秀!微软《550页图解.Net+WPF完整版》.pdf 附下载!
  4. MongoDB查询性能分析—— explain 操作返回结果详解
  5. Python安装工具包踩过的坑
  6. 第二届数据科学家大会日程发布,9月20-21日在桂林等您~
  7. Python是什么?有那些用途?
  8. python svm 决策方程_python – 使用scikit-learn线性SVM提取决策边界
  9. THINKPHP中使用swoole
  10. [Usaco2007 Dec]宝石手镯[01背包][水]
  11. git命令出现fatal: unable to access SSL certificate problem: self signed certificate
  12. 白板推导系列Pytorch-期望最大(EM)算法
  13. Structs2文件上传以及预览
  14. VP9与H.265的6个不同点
  15. 论文阅读:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector
  16. 华为USG防火墙NAT
  17. 解决explorer.exe 应用程序错误,内存不能为 read或written的解决方法小结
  18. css2D、3D详解
  19. 【IT人物】周杰(清华,耶鲁):Google技术总监周杰创业“死海”淘金
  20. 工信部教育与考试中心-软件测试工程师考试题A卷-答

热门文章

  1. 软件测试压力测试例子,第一个web压力测试例子 - 稻香老农 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  2. Knuth 洗牌算法
  3. C语言:编译时指定头文件路径
  4. Windows7系统使用技巧(如何让你的win7用的更酷)
  5. 互联网时代,企业经营管理面临的挑战有哪些?
  6. 腾讯首席科学家-张正友:AI加速破解生命科学的重要问题
  7. 管理者应该怎么面对员工的顶撞
  8. 线性代数 矩阵乘法示例
  9. idea鼠标滚轮修改字体大小
  10. 厦门宝讯网捷:拼多多一件代发怎么做?