牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单:
- class Solution {
- public:
- vector<int> printMatrix(vector<vector<int> > matrix) {
- const int Row = matrix.size();
- const int Col = matrix[].size();
- vector<int> res;
- if(Row|| Col)
- {
- if(Row == )
- for(int i = ;i<Col;i++)
- res.push_back(matrix[][i]);
- else if(Col ==)
- for(int i = ;i<Row;i++)
- res.push_back(matrix[i][]);
- else{
- int index_row =;
- int index_col =;
- int start_row = ;
- int start_col = ;
- while((start_row <=(Row-)/) && (start_col<=(Col-)/))//???
- {
- while(index_col <= Col--start_col)
- {
- res.push_back(matrix[index_row][index_col]);
- index_col++;
- }
- index_col--;
- index_row++;
- while(index_row <= Row--start_row)
- {
- res.push_back(matrix[index_row][index_col]);
- index_row++;
- }
- index_row--;
- index_col--;
- while(index_col >=start_col && index_row != start_row)
- {
- res.push_back(matrix[index_row][index_col]);
- index_col--;
- }
- index_col++;
- index_row--;
- while(index_row >start_row )
- {
- res.push_back(matrix[index_row][index_col]);
- index_row--;
- }
- start_row++;
- start_col++;
- index_row = start_row;
- index_col = start_col;
- }
- }
- return res;
- }
- }
- };
下面我来画一下这个图:
也就是我们按照图示打印所有的矩阵元素,我们没有任何技巧的情况下,所能想到的方法就是,从图中红色标记点开始,执行四趟循环,打印完四个路径。这个大思路总体是没有错误的。我们来看看这其中要注意什么问题:
问题1:从哪里开始?也就是图中红色的地方,那么红色的地方索引是多少呢?
问题2:到哪里结束?也就是最后一次执行完是什么时候,即外层的大循环执行次数怎么决定?
问题3:我们在打印的时候,四个角的位置,既属于这一行,也属于这一列,我们如何避免重复打印?
问题4:我们如何标记索引让下一次的行减少两行,列减少两列?
考虑完上述四个问题:
我之前给出了如下代码:
- class Solution {
- public:
- vector<int> printMatrix(vector<vector<int> > matrix) {
- const int Row = matrix.size();
- const int Col = matrix[].size();
- vector<int> res;
- if(Row|| Col)
- {
- if(Row == )
- for(int i = ;i<Col;i++)
- res.push_back(matrix[][i]);
- else if(Col ==)
- for(int i = ;i<Row;i++)
- res.push_back(matrix[i][]);
- else{
- int index_row =;
- int index_col =;
- int start_row = ;
- int start_col = ;
- while((start_row <=(Row-)/) && (start_col<=(Col-)/))//???
- {
- while(index_col <= Col--start_col)
- {
- res.push_back(matrix[index_row][index_col]);
- index_col++;
- }
- index_col--;
- index_row++;
- while(index_row <= Row--start_row)
- {
- res.push_back(matrix[index_row][index_col]);
- index_row++;
- }
- index_row--;
- index_col--;
- while(index_col >=start_col )
- {
- res.push_back(matrix[index_row][index_col]);
- index_col--;
- }
- index_col++;
- index_row--;
- while(index_row >start_row )
- {
- res.push_back(matrix[index_row][index_col]);
- index_row--;
- }
- start_row++;
- start_col++;
- index_row = start_row;
- index_col = start_col;
- }
- }
- return res;
- }
- }
- };
代码看似没啥差别,请注意第36行代码的变换,我们来看一下通过率:
可以看到,大部分输出都是正确的,只有后面有一些错误输出,主要原因是:我们上述代码并不适应最内层只剩一行或者只剩一列的情况。因此,我们加上了:
- index_row != start_row
也就是避免重复打印同一行或者同一列,当然,这种情况通常也只会在最内层循环产生。
再来关注的一个问题是:如何让每层洋葱循环的行和列依次减去2? 我们发现:0+4 = 1+3=row,这么说你懂了吧。
最后的一个问题是:最后一个红色开始在哪?很明显,外层循环已经给出了答案。
牛客网剑指offer第19题——顺时针打印矩阵的更多相关文章
- 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面
题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...
- 牛客网剑指offer第21题——判断出栈序列是否是入栈序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 牛客网剑指offer第34题——找到第一个只出现一次的字符
题目如下: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 先上代码: class ...
- 剑指offer(19)顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2, ...
- 【剑指Offer】19、顺时针打印矩阵
题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依 ...
- 机器人的运动范围 牛客网 剑指Offer
机器人的运动范围 牛客网 剑指Offer 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大 ...
- 数组中只出现过一次的数字 牛客网 剑指Offer
数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...
- 数组中出现次数超过一半的数字 牛客网 剑指Offer
数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...
- 数据流中的中位数 牛客网 剑指Offer
数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...
随机推荐
- springboot整合elasticJob实战(纯代码开发三种任务类型用法)以及分片系统,事件追踪详解
一 springboot整合 介绍就不多说了,只有这个框架是当当网开源的,支持分布式调度,分布式系统中非常合适(两个服务同时跑不会重复,并且可灵活配置分开分批处理数据,贼方便)! 这里主要还是用到zo ...
- 【学习笔记】Linux基础(一):磁盘分区与Linux的安装(以CentOS为例)
一.磁盘分区与Linux的安装(以CentOS为例) 0.说在安装之前 在Linux中,"一切设备皆文件",设备在/dev这个目录下 /dev/sd[a-p] 表示SCSI/SAT ...
- .net core3.1 webapi + vue.js + axios实现跨域
我所要讲述的是,基于.net core3.1环境下的webapi项目,如何去使用axios对接前端的vue项目 既然谈到axios,这里贴出axios的官方文档地址: http://www.axios ...
- 在一个Activity中循环使用一组RadioGroup
一个activity是用来做题用的,效果如下图 在点击下一题时,RadioGroup会默认为第一次选中的状态,造成RadioButton选择混. 解决方案: 第一步:取消监听 radioGroup_p ...
- 解决python报错:ImportError: No module named shutil_get_terminal_size 的方法
我的环境:Ubuntu 16.04.5 LTS 修改这个文件: $HOME/.local/lib/python2.7/site-packages/IPython/utils/terminal.py 这 ...
- input输入框联想功能
一直想找一个可以连接后台,可以根据后台内容的input输入框,可以实现联想功能,网上找到一个简单的静态页面的输入框联想,经过一番修改之后终于可以实现读取自己定义的数组的联想了,其实也比较简单就是格式的 ...
- JAVA中CLASS.FORNAME的含义
Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的 ...
- HDU_5057_分块
http://acm.hdu.edu.cn/showproblem.php?pid=5057 分块,保存每个块中每位对应数字的和,复杂的是getmum,左右下标所在的块不能直接读取block数组,要重 ...
- CCF_201509-1_数列分段
水. #include<iostream> #include<cstdio> using namespace std; int main() { ]; cin >> ...
- c++ 初始化列表和构造函数初始化区别
先上代码 #include <iostream> class MyContruct { public: MyContruct() { std::cout << "My ...