48、旋转图像(思路是将矩阵左上、右上、左下、右下的点旋转)但是不太理解的是为什么内层的j到n+1//2
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n=len(matrix)
for i in range(n//2):
for j in range((n+1)//2):
temp=matrix[i][j]
matrix[i][j]=matrix[n-1-j][i]
matrix[n-1-j][i]=matrix[n-1-i][n-1-j]
matrix[n-1-i][n-1-j]=matrix[j][n-1-i]
matrix[j][n-1-i]=temp
54、旋转矩阵 (用left,right,up,down确定遍历的边界)
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m=len(matrix)
n=len(matrix[0])
lis=[]
left,right,up,down=0,n-1,0,m-1
while 1:
if left>right:
break
for idx in range(left,right+1):
lis.append(matrix[up][idx])
up+=1
if up>down:
break
for idx in range(up,down+1):
lis.append(matrix[idx][right])
right-=1
if left>right:
break
for idx in range(right,left-1,-1):
lis.append(matrix[down][idx])
down-=1
if up>down:
break
for idx in range(down,up-1,-1):
lis.append(matrix[idx][left])
left+=1
return lis
498、对角线遍历(一开始想是像上面一题,然后发现只要只要移动行和列就可以斜向上遍历或斜向下遍历)需要注意每一次到边界后row,col的值如何改变
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
m=len(mat)
n=len(mat[0])
ele=[]
row=0
col=0
ele.append(mat[row][col])
while (row!=m-1 or col!=n-1):
while 1:
if row==m-1 and col==n-1:
break
if row==0 or col==n-1:#如果到达边界
if col< n-1:
col+=1
ele.append(mat[row][col])
break
else :
row+=1
ele.append(mat[row][col])
break
row-=1
col+=1
ele.append(mat[row][col])
while 1:
if row==m-1 and col==n-1:
break
if col==0 or row==m-1:
if row<m-1 :
row+=1
ele.append(mat[row][col])
break
else:
col+=1
ele.append(mat[row][col])
break
row+=1
col-=1
ele.append(mat[row][col])
return ele
238、除自身的乘数(分别求左侧和右侧的乘积)O(n)
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
left,right,ans=[1]*len(nums),[1]*len(nums),[1]*len(nums)
for i in range(1,len(nums)):
left[i]=left[i-1]*nums[i-1]
for i in range (len(nums)-2,-1,-1):
right[i]=right[i+1]*nums[i+1]
for i in range(len(nums)):
ans[i]=left[i]*right[i]
return ans
空间优化O(1),不引入left right列表,而是直接用两个for循环分别在ans上操作,详见解析,链接如下:238. 除自身以外数组的乘积 - 力扣(LeetCode)
73、矩阵置零(方法一是直接使用一个同样大小的矩阵记录0,二是用第一行和第一列记录该行\列中是否有0,加上对第一行第一列是否有零的标记)
方法二:
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m=len(matrix)
n=len(matrix[0])
flagcol=any(matrix[i][0]==0 for i in range(m))
flagrow=any(matrix[0][j]==0 for j in range(n))
for i in range(1,m):
for j in range(1,n):
if matrix[i][j]==0:
matrix[i][0]=matrix[0][j]=0
for i in range(1,m):
for j in range(1,n):
if matrix[i][0]==0 or matrix[0][j]==0:
matrix[i][j]=0
if flagcol:
for i in range(m):
matrix[i][0]=0
if flagrow:
for j in range(n):
matrix[0][j]=0