《LeetCode零基础指南》(第八讲) 二级指针

832. 翻转图像 - 力扣(LeetCode) (leetcode-cn.com)

思路:暴力查找,将行和列进行转换

解法一:暴力查找,两个for循环,进行遍历,开辟新的数组,进行存储数据,时间复杂度是O(n*n)。空间复杂度是O(n)。

class Solution:
   def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
       s=[]
       for i in range(len(image)):
           t=image[i][::-1]
           for j in range(len(t)):
               if t[j]==1:
                   t[j]=0
               elif t[j]==0:
                   t[j]=1
           s.append(t)
       return s                

解法二:代码的优化,对于时间复杂度没有提升,但是对于空间复杂度有了一个转变。因为只有零和一两种数据,所以可以对零和一取反(一减去原始数据),这样减少了空间上的新建。时间复杂度是O(n*n),空间复杂度是O(1)。

class Solution:
   def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
       s=[]
       for i in range(len(image)):
           t=image[i][::-1]
           for j in range(len(t)):
               t[j]=1-t[j] # 这里也可以使用按位运算,^1
           s.append(t)
       return s

解法三:根据python的特殊性,可以近一步优化代码。时间复杂度是O(n*n),同时在切片是开辟新的空间,所以空间复杂度也是O(n)。

class Solution:
   def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
       return [[i^1 for i in x[::-1]]for x in image]
   # 遍历每一行,然后将每一行进行转换,转换之后与1按位运算

867. 转置矩阵 - 力扣(LeetCode) (leetcode-cn.com)

思路:暴力枚举

解法一:两个for循环遍历,将数组内的数据一个个赋值给另外一组数据。时间复杂度是O(m*n),空间复杂度是O(n),因为创建了一个新的数组进行存储数据。

class Solution:
   def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
       s=[[0]*len(matrix) for i in range(len(matrix[0]))]
       for i in range(len(matrix)):
           for j in range(len(matrix[0])):
               s[j][i]=matrix[i][j]
       return s

解法二:代码的优化,本质上和解法一的代码类似

class Solution:
   def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
       return [[matrix[i][j]for i in range(len(matrix))]for j in range(len(matrix[0]))]

566. 重塑矩阵 - 力扣(LeetCode) (leetcode-cn.com)

思路:暴力分解

解法:创建一个新的数组,进行存放,找到跟原数组的关系进行求解。时间复杂度是O(m* n),空间复杂度是O(m*n)。

class Solution:
   def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
       m,n=len(mat),len(mat[0])
       if m*n!=r*c:
           return mat
       s=[[0]*c for i in range(r)]
       for i in range(m*n):
           s[i//c][i%c]=mat[i//n][i%n]
       return s

 

2022. 将一维数组转变成二维数组 - 力扣(LeetCode) (leetcode-cn.com)

解法一:和第三题的解法类型。新建一个二维数组,然后进行一个个传值。时间复杂度是O(m*n),空间复杂度是O(m *n)。

class Solution:
   def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]:
       if m*n!=len(original):
           return []
       s=[[0]*n for _  in range(m)]
       for i in range(len(original)):
           s[i//n][i%n]=original[i]
       return s    

1260. 二维网格迁移 - 力扣(LeetCode) (leetcode-cn.com)

class Solution:
   def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int]]:
       m,n=len(grid),len(grid[0])
       s=[grid[i][j]for i in range(m) for j in range(n)]
       t=s[-(k%(m*n)):]
       s=t+s
       st=[[0]*n for i in range(m)]
       for i in range(m*n):
           st[i//n][i%n]=s[i]
       return st

 

posted @ 2022-04-04 21:47  食尸之鬼  阅读(59)  评论(0)    收藏  举报