螺旋矩阵

题目

给定一个包含 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腾讯精选练习之螺旋矩阵(八)的更多相关文章

  1. LeetCode 59. Spiral Matrix II (螺旋矩阵之二)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  2. LeetCode OJ:Spiral MatrixII(螺旋矩阵II)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  3. 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 ...

  4. leetcode腾讯精选练习(50 题)(持续更新)

    1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘 ...

  5. LeetCode 腾讯精选50题--二叉树中的最大路径和

    二叉树中的最大路径和 题目描述 给定一个非空二叉树,返回器最大路径和,路径指一条从任意节点出发,到达任意节点的序列,该路径至少包含一个节点,且不一定经过根节点 解题思路 树这一类数据结构我还不是很熟悉 ...

  6. LeetCode 腾讯精选50题--二叉树的最大深度

    求二叉树的最大深度, 基本思路如下: 设定一个全局变量记录二叉树的深度,利用递归,没遍历一层都将临时深度变量+1,并在每一节点递归结束后判断深度大小. 具体代码如下: package algorith ...

  7. LeetCode 腾讯精选50题--2的幂

    在二进制中,2的幂的数字用二进制表示时只会有一位表示为1,其余都为0,基于这个前提,可以有两种方案: 1. 做位移操作 2. 与数值取反并与原数值做与操作,判断是否与原来的数值相同 对于方案1,我的想 ...

  8. LeetCode 腾讯精选50题--求众数

    由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...

  9. LeetCode 腾讯精选50题--只出现一次数字

    事先说明,如果不是评论区的大牛一语点破,我可能还会陷在死胡同里出不来,这道题其实很简单,利用了任何一个学过二进制的人都了解的定理,即: 1. 异或操作满足交换律 : a ^ b ^ c 等价于 a ^ ...

随机推荐

  1. IDE介绍之——CLion

    CLion是JetBrains公司旗下发布的一款跨平台C/C++IDE开发工具. 使用CLion上最好要会手写CMake.要先安装编译器套件(一般安装MinGW就行). 对C++标准的支持:基本上Cl ...

  2. Vue____实现本地代码推送到云端仓库的相关操作

    项目初始化搭建完毕,每进行一个功能模块开发的必备操作,目的是方便协同开发以及备份代码 一.每开发一个新功能,都应该创建一个新分枝,待该功能模块开发完成以后,再合并到主分支master中,具体步骤如下: ...

  3. 第四阶段:1.从零打造一款社区web产品

    ---恢复内容开始--- 熟人关系:微信 陌生人关系:微博 1.把各种竞品罗列起来形成一个分析池.分析其目标用户是哪些.这些产品满足了用户什么需求.可以从时间角度分析趋势.针对每一类竞品画一个商业模式 ...

  4. Spring Cloud的核心成员、以及架构实现详细介绍

    什么是微服务 微服务的概念源于Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为 ...

  5. 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...

  6. JVM探秘:Java对象

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 对象的创建 虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量 ...

  7. Spring Boot 添加Druid连接池(1.5 版本)

    Druid是一个关系型数据库连接池,是阿里巴巴的一个开源项目,地址:https://github.com/alibaba/druid .Druid不但提供连接池的功能,还提供监控功能,可以实时查看数据 ...

  8. Linux-Cacti监控{Verson:1.2.8}

    首先需要一个LAMP平台 或LNMP平台 yum -y install httpd mariadb php mariadb-server mariadb-devel zlib freetype lib ...

  9. Dockerfile + Nginx.conf文件记录(用于前端项目部署)

    Dockerfile + Nginx.conf文件记录(用于前端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理),默认服 ...

  10. 使用redis的zset实现高效分页查询(附完整代码)

    一.需求 移动端系统里有用户和文章,文章可设置权限对部分用户开放.现要实现的功能是,用户浏览自己能看的最新文章,并可以上滑分页查看. 二.数据库表设计 涉及到的数据库表有:用户表TbUser.文章表T ...