Leetcode每日一题-螺旋矩阵

【题目描述】

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例1:

  1. 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  2. 输出:[1,2,3,6,9,8,7,4,5]

示例2:

  1. 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  2. 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  1. m == matrix.length
  2. n == matrix[i].length
  3. 1 <= m, n <= 10
  4. -100 <= matrixi <= 100

【分析】

  • 思路:

    首先打印矩阵周围一圈,再对矩阵进行切片,成为一个新的矩阵,再对新矩阵进行打印,有点递归的感觉。

    切片代码:matrix = [matrix_[c:m_-c][i][c:n_-c] for i in range(m_-c*2)]

  • AC代码:

    1. class Solution(object):
    2. def spiralOrder(self, matrix_):
    3. """
    4. :type matrix: List[List[int]]
    5. :rtype: List[int]
    6. """
    7. output = []
    8. m_ = len(matrix_)
    9. n_ = len(matrix_[0])
    10. cycle = m_ if m_ < n_ else n_
    11. for c in range((cycle+1)//2):
    12. matrix = [matrix_[c:m_-c][i][c:n_-c] for i in range(m_-c*2)]
    13. #print(matrix)
    14. n = len(matrix[0])
    15. m = len(matrix)
    16. for i in range(n):
    17. output.append(matrix[0][i])
    18. for i in range(m-1):
    19. output.append(matrix[i+1][n-1])
    20. for i in range(n-1):
    21. if(m-1==0):
    22. break
    23. output.append(matrix[m-1][n-i-2])
    24. for i in range(m-2):
    25. if(n-1==0):
    26. break
    27. output.append(matrix[m-i-2][0])
    28. return output
  • 讨论:

    • java版的0ms代码:

      1. class Solution {
      2. public List<Integer> spiralOrder(int[][] matrix) {
      3. List<Integer> ans = new ArrayList<>();
      4. int[] pos = { 0, 0 };
      5. // 上 右 下 左
      6. int[] ract = { 0, matrix[0].length - 1, matrix.length - 1, 0, };
      7. // d = 0,1,2,3时 分别代表往右、往下、往左、往上
      8. int d = 0;
      9. while (ans.size() < matrix.length * matrix[0].length) {
      10. ans.add(matrix[pos[0]][pos[1]]);
      11. if (d == 0 && pos[1] < ract[1]){
      12. pos[1] ++;
      13. continue;
      14. }
      15. if (d == 0 && pos[1] == ract[1]){
      16. pos[0] ++;
      17. ract[d] ++;
      18. d = (d + 1) % 4 ;
      19. continue;
      20. }
      21. if (d == 1 && pos[0] < ract[2]){
      22. pos[0] ++;
      23. continue;
      24. }
      25. if (d == 1 && pos[0] == ract[2]){
      26. pos[1] --;
      27. ract[d] --;
      28. d = (d + 1) % 4 ;
      29. continue;
      30. }
      31. if (d == 2 && pos[1] > ract[3]){
      32. pos[1] --;
      33. continue;
      34. }
      35. if (d == 2 && pos[1] == ract[3]){
      36. pos[0] --;
      37. ract[d] --;
      38. d = (d + 1) % 4 ;
      39. continue;
      40. }
      41. if (d == 3 && pos[0] > ract[0]){
      42. pos[0] --;
      43. continue;
      44. }
      45. if (d == 3 && pos[0] == ract[0]){
      46. pos[1] ++;
      47. ract[d] ++;
      48. d = (d + 1) % 4 ;
      49. continue;
      50. }
      51. }
      52. return ans;
      53. }
      54. }
    • 螺旋向量的转移方程:

      1. di, dj = 0, 1
      2. di, dj = dj, -di

      取自点赞量最高的讨论

    • 官方题解: 戳这里

【python】Leetcode每日一题-螺旋矩阵的更多相关文章

  1. 【python】Leetcode每日一题-螺旋矩阵2

    [python]Leetcode每日一题-螺旋矩阵2 [题目描述] 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . ...

  2. 【python】Leetcode每日一题-矩阵置零

    [python]Leetcode每日一题-矩阵置零 [题目描述] 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 .请使用 原地 算法. 进阶: 一个直观的解 ...

  3. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  4. 【python】Leetcode每日一题-删除有序数组中的重复项

    [python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...

  5. 【python】Leetcode每日一题-存在重复元素3

    [python]Leetcode每日一题-存在重复元素3 [题目描述] 给你一个整数数组 nums 和两个整数 k 和 t .请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] ...

  6. 【python】Leetcode每日一题-扰乱字符串

    [python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...

  7. 【python】Leetcode每日一题-前缀树(Trie)

    [python]Leetcode每日一题-前缀树(Trie) [题目描述] Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的 ...

  8. 【python】Leetcode每日一题-打家劫舍2

    [python]Leetcode每日一题-打家劫舍2 [题目描述] 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋 ...

  9. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

随机推荐

  1. C# 获取Word文本高亮和背景(附vb.net代码)

    Word中的文本高亮和背景是通过不同方法来设置的.文本高亮(Text Highlight Color)是通过[字体]中的快速工具栏设置:文本背景(Text Background/Shading)是通过 ...

  2. 11、Spring教程之声明式事务

    1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ...

  3. 6、MyBatis教程之日志实现

    7.日志实现 思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题. 对于以 ...

  4. 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之自定义组件(四)

    基于Vue和Quasar的前端SPA项目实战之序列号(四) 回顾 通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之布局菜单(三)的介绍,我们已经完成了布局菜单,本文主要介绍序列号功能的实 ...

  5. 从新建文件夹开始构建UtopiaEngine(1)

    序言 在苦等了半年多之后,我终于开始了向往已久的实时NPR游戏引擎项目--Utopia Engine,这半年多一直为了构建这个引擎在做很多准备:多线程.动态链接库.脚本引擎.立即渲染GUI--统统吃了 ...

  6. Redis扩展数据类型详解

    在Redis中有5种基本数据类型,分别是String, List, Hash, Set, Zset.除此之外,Redis中还有一些实用性很高的扩展数据类型,下面来介绍一下这些扩展数据类型以及它们的使用 ...

  7. RabbitMQ 入门 (Go) - 4. 使用 Fanout Exchange 做服务发现(上)

    到目前为止,我们项目的结果大致如下: 传感器生成的模拟数据(包含传感器名称.数据.时间戳)是通过传感器在运行时动态创建的 Queue 来发送的.这些 Queue 很难直接被发现. 为了解决这个问题,我 ...

  8. SpringBoot-11 扩展功能

    SpringBoot-11 扩展功能 异步 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列.要么成功都成功,失败都失败,两个任务 ...

  9. 使用 Elastic 技术栈构建 Kubernetes全栈监控

    以下我们描述如何使用 Elastic 技术栈来为 Kubernetes 构建监控环境.可观测性的目标是为生产环境提供运维工具来检测服务不可用的情况(比如服务宕机.错误或者响应变慢等),并且保留一些可以 ...

  10. Spring Cloud:面向应用层的云架构解决方案

    Spring Cloud:面向应用层的云架构解决方案 上期文章我们介绍了混合云,以及在实际操作中我们常见的几种混合云模式.今天我们来聊一聊Spring Cloud如何解决应用层的云架构问题. 对于Sp ...