LeetCode54. 螺旋矩阵

题意是,输入一个二维数组,从数组左上角开始,沿着顺时针慢慢地“遍历”每一个元素且每一个元素只遍历一次,
在一个新的一维数组中记录遍历的顺序,最终的返回值就是这个数组。
思路:可以考虑用方向来模拟“一个指针的移动”,指针指向的元素如果合法(不越界且未被访问过),就将这个元素压入结果数组。
这里的核心是“移动指针”,移动指针要注意两点:
- 移动的方向是顺时针:即先往右,再往下,再往左,再往上,再往右。。。。
这里可以用两个方向数组作辅助,比如原来的坐标是(x, y),那么“往右”可以表示为 newX = x, newY = y + 1.
也就是说,每次移动一个方向,只是改变x和y的其中一个值,且改变的值可以枚举。
所以可以用dx表示x的改变: int dx[4] = {0, 1, 0, -1};
用dy表示y的改变: int dy[4] = {1, 0, -1, 0};
再用一个整数变量direction表示“当前的方向”,比如direction为0时,dx[direction] = 0, dy[direction] = 1,
newX = x + dx[direction] = x, newY = y + dy[direction] = y + 1 表示“当前方向向右” - 移动的时候要注意避免“撞墙”,撞墙有两种情况:一种是(newX, newY)越界,一种是(newX, newY)已经访问过了。碰到撞墙,就需要
再更新一下(newX, newY)(通过改变方向)。
由于要记录是否访问过,所以要额外再开一个二维数组记录每个位置的元素是否访问过。
综上,可以得出如下代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) { //行数或列数为0的情况需要特判
return {};
}
int rows = matrix.size(), cols = matrix[0].size(); //记录行数和列数
vector<int> res(rows * cols); //res是结果数组
vector<vector<bool>> visited(rows, vector<bool>(cols)); //记录某个位置的元素是否已访问过
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
for(int x = 0, y = 0, direction = 0, cnt = 0; cnt < rows * cols; ++cnt) { //cnt记录res数组的元素个数,当cnt与matrix元素个数相同时停止更新坐标
res[cnt] = matrix[x][y];
visited[x][y] = true;
int newX = x + dx[direction], newY = y + dy[direction];
if(newX < 0 || newX >= rows || newY < 0 || newY >= cols || visited[newX][newY] == true) { //如果“撞墙”,需要再次更新(newX, newY)
direction = (direction + 1) % 4; //direction只有0 ~ 3 这四种取值,因为只有四个方向!
newX = x + dx[direction], newY = y + dy[direction];
}
x = newX, y = newY; //更新(x, y)为(newX, newY)
}
return res;
}
};
LeetCode54. 螺旋矩阵的更多相关文章
- [Swift]LeetCode54. 螺旋矩阵 | Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
题目描述 给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7 ...
- Leetcode刷题之螺旋矩阵
矩阵之螺旋矩阵 总体思路: 注意遍历顺序 每次遍历一圈时候不要多加元素 Leetcode54螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. ...
- PAT 1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...
- leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?
Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...
- Java-基础编程(螺旋矩阵&乘法表)
package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- PAT-乙级-1050. 螺旋矩阵(25)
1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...
- NOIP2014-普及组复赛-第三题-螺旋矩阵
题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...
随机推荐
- 使用锚点定位不改变url同时平滑的滑动到锚点位置,不会生硬的直接到锚点位置
使用锚点定位不改变url同时平滑的滑动到锚点位置,不会生硬的直接到锚点位置 对前端来说锚点是一个很好用的技术,它能快速定位到预先埋好的位置. 但是美中不足的是它会改变请求地址url,当用户使用了锚点的 ...
- Java实现 LeetCode 313 超级丑数
313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...
- Java实现 蓝桥杯VIP 算法提高 超级玛丽
算法提高 超级玛丽 时间限制:1.0s 内存限制:256.0MB 问题描述 大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步.有一次 ...
- Java实现 LeetCode 120 三角形最小路径和
120. 三角形最小路径和 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] ...
- Java实现 LeetCode 63 不同路径 II(二)
63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在 ...
- (二)CRLF注入
01 漏洞描述 在<HTTP | HTTP报文>一文中,我们介绍了HTTP报文的结构:状态行和首部中的每行以CRLF结束,首部与主体之间由一空行分隔.或者理解为首部最后一个字段有两个CRL ...
- 在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext())
在已经编译安装好php7场景下,install gd库 with free-type (解决Call to undefined function imagettftext()) install g ...
- 基于EntityFramework 6 Code First实现动态建库,分库,数据库自动迁移
一.前言 公司原本有一个"xx系统",ORM使用EntityFramework,Code First模式.该系统是针对某个客户企业的,现要求该系统支持多个企业使用,但是又不能给每个 ...
- k8s学习-集群安装
3.kubernetes安装 3.1.规划 hostname ip 内存 核 硬 说明 harbor 192.168.136.30 2G 2 100G 私有仓库 koolshare 2G 2 20G ...
- 线性表 & 散列表
线性表: 数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向, 包括 数组,链表,队列,栈. 非线性表 : 数据之间并不是简单的前后关系,有二叉树.图等. 散列表(基于 数组支持按照下标 ...