Leetcode每日一题-螺旋矩阵

【题目描述】

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

示例1:

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

示例2:

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

提示:

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

【分析】

  • 思路:

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

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

  • AC代码:

    class Solution(object):
    def spiralOrder(self, matrix_):
    """
    :type matrix: List[List[int]]
    :rtype: List[int]
    """
    output = []
    m_ = len(matrix_)
    n_ = len(matrix_[0])
    cycle = m_ if m_ < n_ else n_
    for c in range((cycle+1)//2):
    matrix = [matrix_[c:m_-c][i][c:n_-c] for i in range(m_-c*2)]
    #print(matrix)
    n = len(matrix[0])
    m = len(matrix)
    for i in range(n):
    output.append(matrix[0][i])
    for i in range(m-1):
    output.append(matrix[i+1][n-1])
    for i in range(n-1):
    if(m-1==0):
    break
    output.append(matrix[m-1][n-i-2])
    for i in range(m-2):
    if(n-1==0):
    break
    output.append(matrix[m-i-2][0])
    return output
  • 讨论:

    • java版的0ms代码:

      class Solution {
      public List<Integer> spiralOrder(int[][] matrix) {
      List<Integer> ans = new ArrayList<>();
      int[] pos = { 0, 0 };
      // 上 右 下 左
      int[] ract = { 0, matrix[0].length - 1, matrix.length - 1, 0, };
      // d = 0,1,2,3时 分别代表往右、往下、往左、往上
      int d = 0;
      while (ans.size() < matrix.length * matrix[0].length) {
      ans.add(matrix[pos[0]][pos[1]]);
      if (d == 0 && pos[1] < ract[1]){
      pos[1] ++;
      continue;
      }
      if (d == 0 && pos[1] == ract[1]){
      pos[0] ++;
      ract[d] ++;
      d = (d + 1) % 4 ;
      continue;
      }
      if (d == 1 && pos[0] < ract[2]){
      pos[0] ++;
      continue;
      }
      if (d == 1 && pos[0] == ract[2]){
      pos[1] --;
      ract[d] --;
      d = (d + 1) % 4 ;
      continue;
      }
      if (d == 2 && pos[1] > ract[3]){
      pos[1] --;
      continue;
      }
      if (d == 2 && pos[1] == ract[3]){
      pos[0] --;
      ract[d] --;
      d = (d + 1) % 4 ;
      continue;
      }
      if (d == 3 && pos[0] > ract[0]){
      pos[0] --;
      continue;
      }
      if (d == 3 && pos[0] == ract[0]){
      pos[1] ++;
      ract[d] ++;
      d = (d + 1) % 4 ;
      continue;
      }
      }
      return ans;
      }
      }
    • 螺旋向量的转移方程:

      di, dj = 0, 1
      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. 基于es实现一个简单的搜索引擎

    一.什么是es Elasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库.但 ...

  2. css3中的渐变效果

    大家好,这里是demo软件园,今天为大家分享的是css3中的渐变效果. css3中的渐变需要注意的是渐变的是图片而不是颜色,而渐变又分为两种:线性渐变与径向渐变,今天我们重点介绍的是线性渐变. 1.线 ...

  3. 使用C# (.NET Core) 实现命令设计模式 (Command Pattern)

    本文的概念内容来自深入浅出设计模式一书. 项目需求 有这样一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可连接不同的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外 ...

  4. 使用Vscode 开发调试 C/C++ 项目

    需要安装的扩展 C/C++ 如果是远程 Linux上开发还需要安装 Remote Development 创建工作目录后,代码远程克隆... 省略.. 创建项目配置文件,主要的作用是代码智能提示,错误 ...

  5. 【洛谷】P1294 高手去散步

    题目背景 高手最近谈恋爱了.不过是单相思."即使是单相思,也是完整的爱情",高手从未放弃对它的追求.今天,这个阳光明媚的早晨,太阳从西边缓缓升起.于是它找到高手,希望在晨读开始之前 ...

  6. Dynamics CRM Report安装出错三

    需要删除和备份报表服务的密钥集 进入到Micorsoft SQL Server Reporting Services配置管理器 选择"加密密钥",点击"删除" ...

  7. @babel/preset-env使用polyfill遇到的坑

    场景还原 最近将一个项目由babel@6升级到babel@7,升级后最重要的两个包: @babel/preset-env: 提供代码的转换和API的polyfill的能力 @babel/plugin- ...

  8. 干掉 Feign,Spring Cloud Square 组件发布

    Spring Cloud Square 是什么 谈起 Spring Cloud 生态大家一定对 Feign 不陌生,如下图所示,Feign 可以把底层(okhttp.httpclient)Rest 的 ...

  9. pytorch从入门到放弃(目录)

    目录 前置基础 Pytorch从入门到放弃 推荐阅读 前置基础 Python从入门到放弃(目录) 人工智能(目录) Pytorch从入门到放弃 01_pytorch和tensorflow的区别 02_ ...

  10. 统计学习方法——实现AdaBoost

    Adaboost 适用问题:二分类问题 模型:加法模型 \[f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x) \] 策略:损失函数为指数函数 \[L(y,f(x))=ex ...