题目:

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

分析:

从外向内顺时针打印每个数字,先不考虑特殊情况,实际上每打印一次外圈至多需要四步,从起始点开始从左向右打印,再从上到下,从右向左,最后再从下到上打印。而且每打印完一圈下次打印的起始坐标都是上次打印起点的右下的元素,考虑一个6*6的矩阵,先从[0,0]的位置开始打印一圈,下次开始则是从[1,1]打印,然后再从[2,2],也就是说如果知道了起始点的坐标,和要打印的矩形范围,便可顺时针打印。

不过根据矩形的大小,有时是不需要4步来打印的。例如:

这种一行n列的矩阵,只需要从左到右打印一次即可,而且不难发现无论什么情况,都需要从左到右打印一次。

当需要第二步打印的情况如下:

也就是行数要大于1,才需要第二步的打印。

需要第三步从右到左的打印情况如下:

不难看出,需要矩形的列数和行数均大于1,才会需要第三步的打印。

而第四步的打印举例如下:

列数大于1,而行数要求大于2.才会需要第四步的打印。

在每次打印外圈数字时,都要判断是否需要2,3,4步的打印。最后还要写好循环的退出条件,也就是没有矩形再需要打印了。

程序:

C++

class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
if(matrix.empty()) return res;
int m = matrix.size()-;
int n = matrix[].size()-;
int i = ;
while((n-i) >= && (m-i) >= ){
readHelper(matrix, i, i, m--, n--);
i++;
}
return res;
}
void readHelper(vector<vector<int>> &v, int x, int y, int m, int n){
//left to right
int i = x;
int j = y;
for(; j <= n; ++j)
res.push_back(v[i][j]);
//up to down
if(m-x > ){
for(i = x+, j = n; i <= m; ++i)
res.push_back(v[i][j]);
}
//right to left
if(m-x > && n - y > ){
for(j = n-, i = m; j >= y; --j)
res.push_back(v[i][j]);
}
//down to up
if(m-x > && n - y > ){
for(i = m-, j = y; i > x; --i)
res.push_back(v[i][j]);
}
}
private:
vector<int> res;
};

Java

import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
res = new ArrayList<>();
if( matrix.length == 0) return res;
int m = matrix.length-1;
int n = matrix[0].length-1;
int index = 0;
while(m-index >= 0 && n-index >= 0){
helper(matrix, index, index, m--, n--);
index++;
}
return res;
}
public void helper(int [][] matrix, int x, int y, int endX, int endY){
for(int j = y; j <= endY; ++j)
res.add(matrix[x][j]);
if((endX - x) > 0){
for(int i = x+1; i <= endX; ++i)
res.add(matrix[i][endY]);
}
if((endX - x) > 0 && (endY - y) > 0){
for(int j = endY-1; j >= y; --j)
res.add(matrix[endX][j]);
}
if((endX - x) > 1 && (endY - y) > 0){
for(int i = endX-1; i > x; --i)
res.add(matrix[i][y]);
}
}
private ArrayList<Integer> res;
}

剑指Offer-19.顺时针打印矩阵(C++/Java)的更多相关文章

  1. 剑指Offer 19. 顺时针打印矩阵 (其他)

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  2. [剑指Offer] 19.顺时针打印矩阵

    [思路]本题关键在于 右->左 和 下->上 两个循环体中的判断条件,即判断是否重复打印. class Solution { public: vector<int> print ...

  3. 【剑指Offer】顺时针打印矩阵 解题报告(Python)

    [剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  4. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  5. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

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

    剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...

  7. 力扣 - 剑指 Offer 29. 顺时针打印矩阵

    题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...

  8. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  9. 剑指offer得意之作——顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3 ...

  10. 【Java】 剑指offer(29) 顺时针打印矩阵

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 思 ...

随机推荐

  1. AcWing 803. 区间合并

    网址 https://www.acwing.com/solution/AcWing/content/1590/ 题目描述给定n个区间[l, r]. 合并所有有交集的区间. 输出合并完成后的区间个数. ...

  2. kindEditor 修改上传图片的路径

    压缩过的js类似

  3. for循环用了那么多次,但你真的了解它么?

    一.基础的for循环 0.使用while也是一种循环方式,此处探究for相关的循环,就不做拓展了. 1.遍历数组的时候,初学时是使用的如下样式的for循环: for(int i=0;i<a.le ...

  4. Lambda,递归

    1.Lamdba表达式 1.Lambda表达式的标准格式 三部分组成: 一些参数 一个箭头 一段代码 格式: (参数列表) -> {一些重写方法的代码} 解释说明格式: ():接口中抽象方法的参 ...

  5. PHP fastcgi_finish_request 方法

    本文介绍,PHP运行在FastCGI模式时,FPM提供的方法:fastcgi_finish_request. 在说这个方法之前,我们先了解PHP有哪些常用的运行模式? PHP运行模式 CGI 通用网关 ...

  6. 易飞ERP API接口调用DEMO

    一.使用场景: 1.需要开放ERP数据给第三方系统对接,如APP手机端开发,MES,OA等: 2.接口按现在主流开发,restful风格,传JSON数据,跨平台,不限开发工具: 3.不限易飞ERP,支 ...

  7. git报错:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig

    在给git设置用户名和邮箱的时候报下面的错误:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig看提示的意思是git ...

  8. Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 胡萝卜酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  9. 仅支持基本增删改查的学生自制php操作mysql的工具类 DB.class.php (学生笔记)

    <?php class DB{ //主机地址 var $host; //用户名 var $username; //密码 var $password; //数据库名 var $dbname; // ...

  10. java核心技术第三篇之JDBC第一篇

    01.JDBC_两个重要的概念: 1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库. 驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言:后 ...