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列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...
随机推荐
- Nginx 笔记(四)nginx 原理与优化参数配置 与 nginx 搭建高可用集群
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.nginx 原理与优化参数配置 master-workers 的机制的好处 首先,对于每个 ...
- Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)
1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...
- Java实现 LeetCode 328 奇偶链表
328. 奇偶链表 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起.请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性. 请尝试使用原地算法完成.你的算法的空间复杂 ...
- Java实现 洛谷 P1103 书本整理
题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所以Frank首先将书按高度顺序排列在书架上.但是Frank发现,由于很多书的宽度不同,所 ...
- java实现复制网站内容
复制网站内容 复制代码 本程序将网站"www.baidu.com"首页的内容复制保存在文件test.html中.写了如下代码,请完善之: import java.net.*; im ...
- 逐行解读HashMap源码
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 一.写在前面 相 ...
- Go 语言入门教程:变量
基础使用 // base.go 注释package main // 包名import "fmt" // 导入 func main() { fmt.Println(" ...
- K8S-PV和PVC的实践
一.什么是PV和PVC? PV的全称是Persistent Volume,翻译过来为持久化存储卷,是对底层的共享存储的一种抽象,PV由管理员进行创建和配置,主要含存储能力.访问模式.存储类型.回收策略 ...
- python—模块与包
模块: (一个.py文件就是一个模块module,模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.) 模块分三种: 1.python标准库 2.第三方模块 3.应用程序自定义模块 ...
- web静态页面资源访问路径问题
我使用的是idea,今天搭建一个项目时遇见了css和js路径错误,导致浏览器获取不到资源路径 这是我最开始写的路径 <link href="/main/loginMain.css&qu ...