zoukankan      html  css  js  c++  java
  • 【Leetcode 数组】 螺旋矩阵(54)

    题目

    给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

    示例 1:

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

    示例 2:

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

    解答

    像搜索一样,定义一个表示上下左右移动的数组。可代码量,哭辽...

    z = [
                [0, 1],  # 右
                [1, 0],  # 下
                [0, -1],  # 左
                [-1, 0]  # 上
            ]
    

    2020.5.30更新:不用定义移动数组,直接计算就OK。

    (2020.5.30更新)代码实现:

    class Solution:
        # Time: O(N),N为数值个数
        def spiralOrder(self, a):
            if not a:
                return []
            X, Y = len(a), len(a[0])
            x, y = 0, 0
            l = []
    
            while len(l) < X*Y:
                if a[x][y] != float('inf'):
                    l.append(a[x][y])
                    a[x][y] = float('inf')
                while y+1 < Y and a[x][y+1] != float('inf'):  # 向右
                    y += 1
                    l.append(a[x][y])
                    a[x][y] = float('inf')
                while x+1 < X and a[x+1][y] != float('inf'):  # 向下
                    x += 1
                    l.append(a[x][y])
                    a[x][y] = float('inf')
                while y-1 >= 0 and a[x][y-1] != float('inf'):  # 向左
                    y -= 1
                    l.append(a[x][y])
                    a[x][y] = float('inf')
                while x-1 >= 0 and a[x-1][y] != float('inf'):  # 向上
                    x -= 1
                    l.append(a[x][y])
                    a[x][y] = float('inf')
            return l
    
    
    s = Solution()
    ans = s.spiralOrder([[1, 2, 3, 4], 
                         [5, 6, 7, 8], 
                         [9, 10, 11, 12], 
                         [13, 14, 15, 16]
                         ])
    print(ans)
    
    # [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]
    
  • 相关阅读:
    c语言 作用域、存储期、链接属性汇总
    进程上下文切换分析
    进程装载过程分析(execve系统调用分析)
    fork 创建进程的过程分析
    系统调用软中断处理程序system_call分析
    linux 系统调用分析
    8分钟带你深入浅出搞懂Nginx
    控制反转
    JAVA泛型(转)
    AOP(转)
  • 原文地址:https://www.cnblogs.com/ldy-miss/p/12122617.html
Copyright © 2011-2022 走看看