题目:

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

    2.安装文件 采用源码方式安装 可用下面地址自行下载 https://sourceforge.net/projects/sqliteman/files/sqliteman/1.2.2/ 3.安装 1) ...

  2. MYSQL的备份与恢复--逻辑备份mysqldump

    目录 0.备份与恢复概述 1.逻辑备份-完整备份与恢复 2.逻辑备份-增量备份与恢复 (1)环境准备 (2)恢复全量数据 (3)恢复增量备份 3.新来的开发妹子删了库! (1)模拟环境准备 (2)全备 ...

  3. 阿里云服务器 ECS Jenkins 安装教程

    参考:https://blog.csdn.net/liqing0013/article/details/83930419

  4. [BZOJ1042]AOI2008]硬币购物

    题目描述 Description 硬币购物一共有4种硬币.面值分别为\(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) .某人去商店买东西,去了\(tot\) 次.每次带\(d_i\ ...

  5. WPF/C# 快捷键 自动生成方法

    原文:WPF/C# 快捷键 自动生成方法 这一篇文章会很短~ 在写依赖属性的会后   propdb 会自动生成依赖属性所有的内容 但是如果我写属性变化通知的时候   希望有一个快捷键能自动生成方法 怎 ...

  6. # Spring 练习ioc 、aop

    Spring 练习 通过学习spring的基础知识,了解了Spring为了降低Java开发的复杂性,采取了以下4种关键策略: 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: ...

  7. vue表格合并行的一个实例

        一.element控件实现 在平常的应用中,需要用到合并单元格的操作,在Excel中,这种操作很好实现,但在实际项目中,常常需要借助element控件来实现. 下面是element中的一个实例 ...

  8. 阿里Nacos-配置-多环境

    多环境的配置隔离是配置中心最基础的一个功能之一.不同的环境配置的值不一样,比如数据库的信息,业务的配置等. Spring Boot 多环境配置 首先我们来回顾下在Spring Boot中用配置文件的方 ...

  9. 【MySQL报错】ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

    ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot exec ...

  10. Python远程linux执行命令

    1.远程登录到linux上,使用到的模块paramiko #远程登陆操作系统 def ssh(sys_ip,username,password,cmds): try #创建ssh客户端 client ...