矩阵 先记下来,统一记0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution : def setZeroes (self, matrix: List [List [int ]] ) -> None : m = len (matrix) n = len (matrix[0 ]) is_zero = [] for i in range (m): for j in range (n): if matrix[i][j] == 0 : is_zero.append([i, j]) for i, j in is_zero: ii = 0 while 0 <= ii <= m-1 : matrix[ii][j] = 0 ii += 1 jj = 0 while 0 <= jj <= n-1 : matrix[i][jj] = 0 jj+= 1
这方法好叼,转置后反转,取第一行
1 2 3 4 5 6 7 8 9 class Solution : def spiralOrder (self, matrix: List [List [int ]] ) -> List [int ]: ans = [] while matrix: ans.extend(matrix[0 ]) matrix.pop(0 ) matrix = list (zip (*matrix))[::-1 ] return ans
这个**list(zip(*matrix))[::-1]**就背吧
矩阵转置:matrix[i][j] ↔ matrix[j][i] 矩阵水平镜像:matrix[i][j] ↔ matrix[i][n-1-j] 矩阵垂直镜像:matrix[i][j] ↔ matrix[m-1-i][j] 矩阵顺时针旋转90度, new_matrix[j][n-1-i] = matrix[i][j],就相当于垂直镜像+转置 矩阵顺时针旋转180度,new_matrix[n-1-i][n-1-j] = matrix[i][j],就相当于水平镜像+垂直镜像 矩阵逆时针旋转90度,new_matrix[n-1-j][i] = matrix[i][j],就相当于水平镜像+转置 matrix[:] = [list(row) for row in zip(*matrix[::-1])]
1 2 3 4 5 6 7 8 9 10 class Solution : def rotate (self, matrix: List [List [int ]] ) -> None : n = len (matrix) matrix_new = [[0 ] * n for _ in range (n)] for i in range (n): for j in range (n): matrix_new[j][n - i - 1 ] = matrix[i][j] matrix[:] = matrix_new
如图所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution : def searchMatrix (self, matrix: List [List [int ]], target: int ) -> bool : def search (i, j, target ): up, down = 0 , i while up <= down: mid = (up + down) / 2 mid = int (mid) if matrix[mid][j] == target: return True elif matrix[mid][j] > target: down = mid - 1 elif matrix[mid][j] < target: up = mid + 1 i, j =0 , 0 queue = [] m = len (matrix) n = len (matrix[0 ]) for j in range (n-1 , -1 , -1 ): if matrix[0 ][j] < target: if search(m-1 , j, target): return True elif matrix[0 ][j] == target: return True
二分查找只需要记住:
nums[mid] > target:目标在左边,所以 right = mid - 1
nums[mid] < target:目标在右边,所以 left = mid + 1
nums[mid] == target:找到,返回 True