1、给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
class Solution: def generateMatrix(self, n: int) -> List[List[int]]: if n == 0: return [] row = col = n ans = [[False] * row for _ in range(col)] dr = [0, 1, 0, -1] dc = [1, 0, -1, 0] r = c = di = 0 for v in range(1, row * col + 1): ans[r][c] = v cr, cc = r + dr[di], c + dc[di] if 0 <= cr < row and 0 <= cc < col and not ans[cr][cc]: r = cr c = cc else: di = (di + 1) % 4 r, c = r + dr[di], c + dc[di] return ans def generate(self,n): list0=[j for j in range(1,n**2+1)] x=y=0 dx=[0,1,0,-1] dy=[1,0,-1,0] di=0 visited=set() list1=[[None]*n for _ in range(n)] for i in range(n**2): list1[x][y]=i visited.add((x,y)) nx,ny=x+dx[di],y+dy[di] if 0<=nx<m and 0<=ny<n and (nx,ny) not in visited: x,y=nx,ny else: di=(di+1)%4 x,y=x+dx[di],y+dy[di] return list12、给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix:return [] x=y=0 res = [] dx = [ 0, 1, 0,-1] dy = [ 1, 0,-1, 0] di = 0 visited = set() m,n = len(matrix),len(matrix[0]) for i in range(m*n): res.append(matrix[x][y]) visited.add((x,y)) tx,ty = x+dx[di],y+dy[di] if 0<=tx<m and 0<=ty<n and (tx,ty) not in visited: x,y = tx,ty else: di = (di+1)%4 x,y = x + dx[di],y+dy[di] return res #def spiralOrder(self, matrix: List[List[int]]) -> List[int]: #res = [] #while matrix: #res += matrix.pop(0) #matrix = list(map(list, zip(*matrix)))[::-1] #return res3、给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
class Solution: def rotate(self,matrix): length=len(matrix) matrix[:]=matrix[::-1] #for i in range(length//2): #for j in range(length): #tmp=matrix[i][j] #matrix[i][j]=matrix[length-i-i][j] #matrix[length-1-i][j]=tmp for i in range(length): for j in range(i): matrix[j][i],matrix[i][j]=matrix[i][j],matrix[j][i] #matrix[:]=matrix[::-1] 逆时针旋转4、给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
class Solution: def generateMatrix(self, n: int) -> List[List[int]]: list0 = [j for j in range(1,n**2 + 1)] x = y = 0 dx = [0,1,0,-1] dy = [1,0,-1,0] di = 0 visited = set() list1 = [[None for k in range(n)] for k in range(n)] for i in range(n**2): list1[x][y] = list0[i] visited.add((x,y)) nx,ny = x + dx[di],y+dy[di] if 0<=nx<n and 0<=ny<n and (nx,ny) not in visited: x,y = nx,ny else: di = (di+1)%4 x,y= x+dx[di],y+dy[di] return list1