题目:

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

    1.win7 Adobe flash player 无法在线更新,提示应用程序初始化错误 解决方法: 1.https://www.flash.cn/看一下支持的版本,网上找对应版本离线包下载安装即可 ...

  2. git 代码管理

  3. docker搭建zookeeper集群

    1.在官网拉取镜像 docker pull zookeeper 2.根据镜像启动zookeeper容器 docker run -itd --name zookeeper1 -h zookeeper1 ...

  4. umi+dva+antd新建项目(亲测可用)

    首先全局安装dva+umiumi:npm install -g umidva:npm install -g dva-cli 通过脚手架创建项目 一: mkdir myapp && cd ...

  5. Android Monkey的用法(一)

      Monkey 简介 ü  Monkey 是一个命令行工具,可以运行在 Android 模拟器里或真实设备中.它可以向系统发送伪随机(pseudo-random)的用户事件流(如按键输入.触摸屏输入 ...

  6. 图解Java常用数据结构

    最近在整理数据结构方面的知识, 系统化看了下 Java 中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于 jdk8, 可能会有些特性与 jdk7 之前不相同, 例如 LinkedList ...

  7. 学习 正则表达式 js java c# python 通用

    正则表达式 js java c# python 学习网站 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Globa ...

  8. 【Linux】LVM操作添加新硬盘

    目录 1.查看当前硬盘及分区情况 2.初始化/dev/sdb为PV(physical volume) 3.PV加入至VG组. 4.创建lv 5.格式化逻辑分区 6.挂载硬盘/data 7.迁移zabb ...

  9. 恢复Chrome 78以上版本的地址栏https和www显示

    Google在Chrome不知道是脑子抽抽还是怎么回事,非要把https://www从地址栏中隐藏掉. htttps://www.pool.ntp.org就给你显示个pool.ntp.org,这分明就 ...

  10. Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...