作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/spiral-matrix-ii/description/

题目描述

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

For example,
Given n = 3, You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

题目大意

顺时针由内向内螺旋状把1~n^2这些数字生成二维矩阵。

解题方法

明显是54. Spiral Matrix的翻版,54题让我们打印,这个题让我们生成。因此其实是一样的套路,都是同样的方式进行遍历。

这个题由于没有给matrix,所以自己生成一个正方形的矩阵,然后把54题的读取matrix的值改为给matrix当前位置填写值即可。

维护四个边界和运动方向

螺旋填充,一定会在遍历的时候更改方向。在什么时候更改方向呢?在最外圈运动的时候是到达边界的时候。但是当移动到Example 1中4的位置时,要向右移动(而不是向上),那么相当于上边界已经移动了第二行。

同理,我们推断:

我们维护四个边界left, right, up, down,表示尚未走过的、可以移动的矩阵范围,起始时四个边界即矩阵的边界。当每次遇到新的边界的时候,需要把移动方向顺时针旋转90度,同时把刚刚走过的那个边界线(这条边界线上所有元素已经遍历过)需要向矩阵内移动,即缩小了边界。当所有的位置都被遍历了一次,则停止。

python代码如下,核心是每次遇到新的边界时,顺时针修改移动方向,并且将老边界内移。

保存已经走过的位置

一个比较蠢的实现方式:使用一个二维数组保存哪些走过了。这样遍历的时候,如果发现走过了就停止。因为while断开了,所以在当前的循环方向上要回退一格,然后移动行、列。

class Solution(object):
def generateMatrix(self, n):
"""
:type n: int
:rtype: List[List[int]]
"""
visited = [[0] * n for _ in range(n)]
matrix = [[0] * n for _ in range(n)]
self.row, self.col = 0, 0
self.curr = 1
def spiral():
move = False
while self.col < n and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.col += 1
move = True
self.col -= 1
self.row += 1
while self.row < n and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.row += 1
move = True
self.row -= 1
self.col -= 1
while self.col >= 0 and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.col -= 1
move = True
self.col += 1
self.row -= 1
while self.row >= 0 and not visited[self.row][self.col]:
matrix[self.row][self.col] = self.curr
self.curr += 1
visited[self.row][self.col] = 1
self.row -= 1
move = True
self.row += 1
self.col += 1
if move:
spiral()
spiral()
return matrix

日期

2018 年 3 月 13 日
2019 年 9 月 13 日 —— 一年半后的做法明显变得简单了~

【LeetCode】59. Spiral Matrix II 解题报告(Python)的更多相关文章

  1. LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

    Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...

  2. LeetCode: 59. Spiral Matrix II(Medium)

    1. 原题链接 https://leetcode.com/problems/spiral-matrix-ii/description/ 2. 题目要求 给定一个正整数n,求出从1到n平方的螺旋矩阵.例 ...

  3. [LeetCode] 59. Spiral Matrix II 螺旋矩阵 II

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

  4. Leetcode#59 Spiral Matrix II

    原题地址 相比于Spiral Matrix(参见这篇文章)要简单一些,因为是方阵,所以代码简洁一些. 注意当n是奇数的时候,中心小块要单独赋值(代码21行) 代码: vector<vector& ...

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

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

  6. [leetcode]59. Spiral Matrix II螺旋遍历矩阵2

    Given a positive integer n, generate a square matrix filled with elements from 1 to n^2 in spiral or ...

  7. Leetcode 54. Spiral Matrix & 59. Spiral Matrix II

    54. Spiral Matrix [Medium] Description Given a matrix of m x n elements (m rows, n columns), return ...

  8. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

  9. 【leetcode】59.Spiral Matrix II

    Leetcode59 Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 ...

随机推荐

  1. Docker网络设置及文件挂载

    网络设置–net=bridge- 默认选项,用网桥的方式来连接docker容器.–net=host- docker跳过配置容器的独立网络栈.–net=container:NAME_or_ID- 告诉d ...

  2. javaSE高级篇4 — 反射机制( 含类加载器 ) — 更新完毕

    反射机制 1.反射机制是什么?----英文单词是:reflect.在java.lang包下---这才是java最牛逼的技术 首先提前知道一句话----在java中,有了对象,于是有了类,那么有了类之后 ...

  3. 【STM32】晶振,主时钟,外设频率介绍

    首先,我用的是STM32F407,下方所有图片都是出自这芯片的文档,如果型号和我不同,需要找到对应的芯片说明文档,也许会有出入 先看一张时钟图 这里会着重说明高速的部分,低速(不管内部还是外部)只给R ...

  4. 03-Collection用例管理及批量执行

    当我们对一个或多个系统中的很多用例进行维护时,首先想到的就是对用例进行分类管理,同时还希望对这批用例做回归测试 .在postman也提供了这样一个功能,就是Collection .通过这个Collec ...

  5. 事务(@Transactional注解)的用法和实例

    参数 @Transactional可以配制那些参数及以其所代表的意义: 参数 意义 isolation 事务隔离级别 propagation 事务传播机制 readOnly 事务读写性 noRollb ...

  6. ubuntu基础

    下载地址: http://cdimage.ubuntu.com/releases/ #:配置多网卡静态IP地址和路由 root@ubuntu:~# vim /etc/netplan/01-netcfg ...

  7. Spring Cloud集成RabbitMQ的使用

    同步 or 异步 前言:我们现在有一个用微服务架构模式开发的系统,系统里有一个商品服务和订单服务,且它们都是同步通信的. 目前我们商品服务和订单服务之间的通信方式是同步的,当业务扩大之后,如果还继续使 ...

  8. MySQL(5):安装MySQL

    下载地址 下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 安装步骤 第一步:下载得到压缩包,并解压 ...

  9. linux系统的一些常用命令

    cd 进入某个目录 ifconfig 查看本机的ip cp (要复制的文件的位置) (要把文件复制的位置) ll 查看文件下,文件的操作权限 ls查看该文件夹下的有那些文件和文件夹 vi filena ...

  10. solr8.2

    https://www.cnblogs.com/carlosouyang/p/11352779.html