zoukankan      html  css  js  c++  java
  • Leetcode之SpiralMatrix(I,II)

    总结两道题,都是和数组有关。

    Spiral Matrix(LC54 Medium):

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

    For example,
    Given the following matrix:

    [
     [ 1, 2, 3 ],
     [ 4, 5, 6 ],
     [ 7, 8, 9 ]
    ]
    

    You should return [1,2,3,6,9,8,7,4,5].

    class Solution(object):
        def spiralOrder(self, matrix):
            """
            :type matrix: List[List[int]]
            :rtype: List[int]
            """
            result=[]
            if not matrix:
                return []
            if len(matrix[0])==1:
                for i in range(len(matrix)):
                    result.append(matrix[i][0])
            else:
                while matrix:
                    result+=matrix.pop(0)# first line
                    if matrix and matrix[0]:
                        for i in range(len(matrix)):
                            result.append(matrix[i].pop())
                    if matrix:
                        result+=matrix.pop()[::-1]
                    if matrix and matrix[0]:
                        for i in matrix[::-1]:
                            result.append(i.pop(0))
            return result

    这道题是给定了一个螺旋的matrix,然后再按顺序返回

    主要技巧在于使用pop,pop(0)表示弹出第一个元素,pop()默认弹出最后一个元素

    然后按照螺旋的走势,把pop出来的元素append到result里

    期中,matrix.pop()[::-1]中的[::-1]表示在matrix最后一行,从最后一个元素开始pop,直到最后一行所有元素pop出去,不需要循环,所以不能用append,只能用+

    例子:

    [
     [ 1, 2, 3 ],
     [ 4, 5, 6 ],
     [ 7, 8, 9 ]
    ]
    1. 先把第一行所有元素从左到右pop出去,因为只需要一直pop(0)就行,所以不需要循环,所以不能用append,用+
    2. 然后按照螺旋的顺序,应该是最右边,从上到小,6,9。这里的操作必须是在matrix和matrix[0]不为空时。这里用了循环,pop()每行最后一个元素,用append
    3. 接下来是8,7.要考虑matrix不为空,因为是从matrix最后一行,从最后一个元素pop
    4. 最后是4,5.因为是最后两个元素,所以其他元素应该已经被pop出去了,所以这里相当于是从matrix最后一行开始从左到右pop(0),循环,用append

    Spiral Matrix II(LC59)

    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 ]
    ]
    class Solution(object):
        def generateMatrix(self, n):
            """
            :type n: int
            :rtype: List[List[int]]
            """
            result=[]
            left=n*n+1
            while left>1:
                left,right=left-len(result),left
                result=[range(left,right)]+zip(*result[::-1])
            return result 
            
            

     1. 这道题的思路很巧妙,从最大的那个数:n*n开始加入result,先顺时针旋转数组,然后在前面加元素,直到1

    2. 旋转数组用了zip,zip(*result[::-1]),返回的是tuple (zip: https://www.cnblogs.com/frydsh/archive/2012/07/10/2585370.html

    例子:

    1. zip:

    zip(*xyz)==zip(zip(x,y,z))






  • 相关阅读:
    flutter项目目录介绍
    flutter真机调试出现flutter Launching 'app' on No Devices.
    flutter run出现 Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
    小程序uni-app中uview中select选择器第二次无法选中设置的默认值
    android studio编译flutter项目
    如何解决:Android Studio (version 4.1); Flutter plugin not installed and Dart plugin not installed errors
    CF Round 87
    CF #643(div.2)
    CF #642(div.3)
    CF #638(div.2)
  • 原文地址:https://www.cnblogs.com/x1mercy/p/8016576.html
Copyright © 2011-2022 走看看