【剑指offer】题目20 顺时针打印矩阵
2015-07-10 10:38
295 查看
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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.
思路:
关键注意①每一圈中四条边的边界,要每一次都打印到这一条边的末尾。右边的策略是错的,因为在只有一行一列时每一条边都判定该元素是下一条边的,导致错误。
②下面的边和左边的边还需要判断跟上面的边或右边的边是否重复。防止只有一行或者只有一列时出现重复。
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.
思路:
关键注意①每一圈中四条边的边界,要每一次都打印到这一条边的末尾。右边的策略是错的,因为在只有一行一列时每一条边都判定该元素是下一条边的,导致错误。
②下面的边和左边的边还需要判断跟上面的边或右边的边是否重复。防止只有一行或者只有一列时出现重复。
vector<int> printMatrix(vector<vector<int> > matrix) { vector<int> ans; if(matrix.empty()) return ans; int m = matrix.size(); int n = matrix[0].size(); int r, c; for(int k = 0; k <= (min(m, n) - 1) / 2; k++) //打印的圈数 最外圈为第0圈 { //从左到右 最上面的那条边 r = k; for(c = k; c <= n - 1 - k; c++) ans.push_back(matrix[r][c]); //从上到下 最右边的那条边 c = n - 1 - k; for(r = k + 1; r <= m - 1 - k; r++) ans.push_back(matrix[r][c]); //从右到左 最下面的那条边 r = m - 1 - k; for(c = n - 2 - k; c >= k && r > k; c--) //需要判断与上面的边不重合 ans.push_back(matrix[r][c]); //从下到上 最左边的那条边 c = k; for(r = m - 2 - k; r >= k + 1 && c < n - 1 - k; r--) //需要判断与右边的边不重合
ans.push_back(matrix[r][c]); } return ans; }
相关文章推荐
- FastJson的使用
- 原生js 异步请求,responseXML解析
- 移动设备、手机浏览器Javascript滑动事件代码
- JSP内置对象与servlet对应关系
- 不要使用SBJSON(json-framework)
- jQuery.extend 函数详解
- HTML5 五大特性
- ubuntu nodejs + express4.x 安装 测试
- google protocol buffer的原理和使用(四)
- js 网页各种定位
- Highcharts + jQuery + Servlet 实现从后台获取JSON实时刷新图表
- 基于jquery鼠标点击图片翻开切换效果
- jquery的$(#id).each()和jquery.each()的用法区别
- google protocol buffer的原理和使用(三)
- JavaScript数据类型转换
- warning: cast to pointer from integer of diffe
- google protocol buffer的原理和使用(二)
- JSVM代码阅读笔记
- 通过官方网站的资料学习node
- protocol buffer介绍(protobuf)