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列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...
随机推荐
- Java实现 LeetCode 775 全局倒置与局部倒置(分析题)
775. 全局倒置与局部倒置 数组 A 是 [0, 1, -, N - 1] 的一种排列,N 是数组 A 的长度.全局倒置指的是 i,j 满足 0 <= i < j < N 并且 A ...
- Java实现 蓝桥杯 算法训练 Balloons in a Box
试题 算法训练 Balloons in a Box 问题描述 你要写一个程序,使得能够模拟在长方体的盒子里放置球形的气球. 接下来是模拟的方案.假设你已知一个长方体的盒子和一个点集.每一个点代表一个可 ...
- Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)
741. 摘樱桃 一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示: 0 表示这个格子是空的,所以你可以穿过它. 1 表示这个格子里装着一个樱桃,你可以摘到樱桃然 ...
- Java实现 LeetCode 678 有效的括号字符串(暴力+思路转换)
678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何右括号 ...
- Java实现 LeetCode 636 函数的独占时间(栈)
636. 函数的独占时间 给出一个非抢占单线程CPU的 n 个函数运行日志,找到函数的独占时间. 每个函数都有一个唯一的 Id,从 0 到 n-1,函数可能会递归调用或者被其他函数调用. 日志是具有以 ...
- Java实现 蓝桥杯 基因牛的繁殖
基因牛的繁殖 张教授采用基因干预技术成功培养出一头母牛,三年后,这头母牛每年会生出1头母牛, 生出来的母牛三年后,又可以每年生出一头母牛.如此循环下去,请问张教授n年后有多少头母牛? 以下程序模拟了这 ...
- Mybatis缓存及延迟加载策略
一:引言 通过前面几篇的文章介绍了Mybatis的一对一.一对多.多对多关系的配置及实现,可是大家发现了吗?在执行关联查询的时候,直接会把当前查询的主表里包含的副表也查询后封装到对象里,其实在实际开发 ...
- 【JAVA习题十九】利用递归方法求5!。
package erase; public class 用递归法求5的阶乘 { public static void main(String[] args) { // TODO Auto-genera ...
- [RH134] 8-磁盘管理
一.磁盘结构 我们以但磁盘的硬盘为例,如图所示: 从内向往有很多的磁道(这里我们只画了5条,实际上非常多),这个磁盘被划分为很多扇区.每个扇区有一个固定的大小,例如512Bytes. 对于多磁盘的硬盘 ...
- Java学习的一般过程
伴随着科学技术的不断发展,世界开始走向信息化.网络化.大数据化.自然而然,计算机专业变得十分热门.尽管如此,计算机专业人才对社会来说仍然是供不应求,当然,这里指的是高层次技术人才.因此,对于我们这些占 ...