leetcode腾讯精选练习之螺旋矩阵(八)
螺旋矩阵
题目
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路
1.判断矩阵是否为空矩阵,如果为空则直接返回。
2.从左向右遍历,行坐标不变,列坐标从小到大,直至该行遍历结束,然后将行坐标自增并判断矩阵是否遍历结束。
3.从上向下遍历,列坐标不变,行坐标从小到大,直至该列遍历完毕,然后将列坐标自减并判断该矩阵是否遍历结束。
4.从左向右遍历,行坐标不变,列坐标从大到小,直至该行遍历结束,然后将行坐标自减并判断矩阵是否遍历结束。
5.从下向上遍历,列坐标不变,行坐标从大到小,直至该列遍历完毕,然后将该列坐标自增并判断是否遍历结束。
6.依次重复2,3,4,5过程,直至整个矩阵遍历完毕。
代码
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.empty()) return res;
int beginX = 0;
int endX = matrix[0].size() - 1;
int beginY = 0;
int endY = matrix.size() - 1;
while (true)
{
//从左到右
for (int i = beginX; i <= endX; i++)
{
res.push_back(matrix[beginY][i]);
}
if (++beginY > endY)
{
break;
}
//从上到下
for (int i = beginY; i <= endY; ++i) {
res.push_back(matrix[i][endX]);
}
if (beginX > --endX)
{
break;
}
// 从右到左
for (int i = endX; i >= beginX; --i)
{
res.push_back(matrix[endY][i]);
}
if (beginY > --endY)
{
break;
}
// 从下往上
for (int i = endY; i >= beginY; --i)
{
res.push_back(matrix[i][beginX]);
}
if (++beginX > endX)
{
break;
}
}
return res;
}
总结
1.确定好要遍历的矩阵的左上角和右小角的坐标,即确定每一轮遍历的起点和终点。
2.确定每个过程坐标变换的规律。
3.该题情况多了一些,按照要求一步一步分析,就不会有遗漏。
螺旋矩阵 II
题目
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3
输出:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
思路
该题的遍历方法与上个题目一样
代码
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > res(n, vector<int>(n));
if (n == 0)
{
return res;
}
int beginX = 0;
int endX = n - 1;
int beginY = 0;
int endY = n - 1;
int index = 1;
while (true) {
//从左到右
for (int i = beginX; i <= endX; i++)
{
res[beginY][i] = index++;
}
if (++beginY > endY)
{
break;
}
//从上到下
for (int i = beginY; i <= endY; ++i) {
res[i][endX] = index++;
}
if (beginX > --endX)
{
break;
}
// 从右到左
for (int i = endX; i >= beginX; --i)
{
res[endY][i] = index++;
}
if (beginY > --endY)
{
break;
}
// 从下往上
for (int i = endY; i >= beginY; --i)
{
res[i][beginX] = index++;
}
if (++beginX > endX)
{
break;
}
}
return res;
}
总结
偷了个懒,从上个题目直接拷贝过来,修改一下遍历操作,这个题目就完成了。
万变不离其宗,掌握了方法,题目都是一样的
leetcode腾讯精选练习之螺旋矩阵(八)的更多相关文章
- LeetCode 59. Spiral Matrix II (螺旋矩阵之二)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- LeetCode OJ:Spiral MatrixII(螺旋矩阵II)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- LeetCode OJ:Spiral Matrix(螺旋矩阵)
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- leetcode腾讯精选练习(50 题)(持续更新)
1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...
- LeetCode 腾讯精选50题--二叉树中的最大路径和
二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...
- LeetCode 腾讯精选50题--二叉树的最大深度
求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...
- LeetCode 腾讯精选50题--2的幂
在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...
- LeetCode 腾讯精选50题--求众数
由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...
- LeetCode 腾讯精选50题--只出现一次数字
事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...
随机推荐
- PDF.JS 读取文件流前端展示 C#
最近再搞PDF得展示问题,因为aspose.pdf成本太高,只能使用pdf.js这个开源强大的前端东东了. 在百度了很久后 网上大都是node,java,php的事例,有位大哥的是C#的后台代码按他写 ...
- Mac Tab自动补全键
最近入手一个Mac(Mac 2019版本),在使用终端时,发现不能使用Tab键自动补全代码,网络搜寻下,发现这里有个方法,记录下,免得自己忘记: 1 / 首先找到这个图标 2 / 输入命令 nano ...
- javaweb项目部署到tomcat之后java文件没有编译
1.选中你的项目==>选择Project 2.将Build Automatcally前的对号去掉后再Clean一下你的项目 这样就可以了,
- 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?
前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...
- mysql锁及四种事务隔离级别笔记
前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...
- JS-数组常用方法整理
想了解数组有哪些原生方法,控制台输出,如图: length:数组的实例属性,返回或设置一个数组中的元素个数. toString():可以把数组转换成字符串,并返回结果. toLocaleString( ...
- 清晰架构(Clean Architecture)的Go微服务: 日志管理
良好的日志记录可以提供丰富的日志数据,便于在调试时发现问题,从而大大提高编码效率. 记录器提供的自动化信息越多越好,日志信息也需要以简洁的方式呈现,便于找到重要的数据. 日志需求: 无需修改业务代码即 ...
- 1040 有几个PAT (25 分)C语言
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T). 现给定字符 ...
- 用实例理解设计模式——代理模式(Python版)
代理模式:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式分为: 静态代理 动态代 ...
- P2722 总分 Score Inflation (完全背包模板)
题目传送门:P2722 总分 Score Inflation 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时 ...