文章目录
写在前面
今天是周六,题目是关于一些矩阵以及矩阵的操作的;
矩阵的定义在线性代数课本中有;
除此之外,今天的题目会涉及到矩阵的一些其他操作;矩阵的水平翻转、垂直翻转、矩阵的顺时针、逆时针旋转、矩阵的转置。
题目解析
1.最富有客户的资产总量(1672)
class Solution:
def maximumWealth(self,accounts:List[List[int]])->int:
sum_1=0
n=len(accounts)
max_sum=sum(accounts[0][:])
for i in range(n):
for j in range(len(accounts[i])):
sum_1+=accounts[i][j]
if sum_1>max_sum:
max_sum=sum_1
sum_1=0
return max_sum
这道题目就依次遍历求出了相应的和,与给定的最大值作比较最后确定最大值循环结束后输出即可。
2.二进制矩阵中的特殊位置(1582)
class Solution:
def numSpecial(self,mat:List[List[int]])->int:
cnt=0
rows=len(mat)
for row in range(rows):
if sum(mat[row])!=1:
continue
col=mat[row].index(1)
if sum(mat[j][col] for j in range(rows) if j!=row)==0:
cnt+=1
return cnt
首先理解什么是特殊位置,即某个元素的行和列只有一个1,其余都为0的位置就是题目中的特殊位置;
1)定义一个计数器,得到了这个矩阵的行数;
2)对行进行循环遍历,首先判断每行的元素的和是否为1,若为1就继续循环里的内容,否则就下一次循环(不为1也就说明这个位置不会是特殊位置);
3)之后利用index方法返回了当前行中1所在的列,对当前列中其他的元素求和判断其是否为0;若是则计数器加1;否则就下一次循环,最后循环结束后返回计数器即可。
3.翻转图像(832)
class Solution:
def flipAndInvertImage(self,image:List[List[int]])->List[List[int]]:
row=len(image)
col=len(image[0])
res_1=[]
for i in range(row):
res_1.append([])
for j in range(col,-1,-1):
res_1[i].append(image[i][j])
for m in range(len(res_1)):
for n in range(len(res_1[0])):
if res_1[m][n]==0:
res_1[m][n]=1
continue
if res_1[m][n]==1:
res_1[m][n]=0
continue
return res_1
翻转图像题目有两个步骤,首先对其进行水平翻转,之后进行反转,最后输出,因此我们也按照两个步骤来写代码;
1)首先返回了给定矩阵的行和列,建立了一个新的列表;
2)接下来进行水平翻转,利用了循环的嵌套,每次循环行时先对列表内生成一个新的列表,之后倒序循环,将其倒序添加在现在的一行中;
3)水平反转后进行反转,仍然是循环遍历,利用if条件判断,遇见0(1)将其改为1(0);最后返回res_1即可。
4.旋转图像(48)
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-j-1][i]
matrix[n-j-1][i]=matrix[n-i-1][n-j-1]
matrix[n-i-1][n-j-1]=matrix[j][n-i-1]
matrix[j][n-i-1]=temp
这道题目理解容易,但设计起来还是有一些难度的,题目中要求我们原地旋转(不能创建一个新的列表),这样的话采用了创建中间变量temp的方法;
1)返回了矩阵的宽度;
2)当n为偶数时,每次旋转只需要遍历一半即可;若n为奇数时,中间位置不改变,需要遍历(n+1)//2次;
3)借助中间变量对各个位置的数进行赋值即可。
5.转置矩阵(867)
class Solution:
def transpose(self,matrix:List[List[int]])->List[List[int]]:
row=len(matrix)
col=len(matrix[0])
ans=[[0]*row for _ in range(col)]
for i in range(row):
for j in range(col):
ans[j][i]=matrix[i][j]
return ans
这道题考察了矩阵的转置;
1)首先得到了这个矩阵的行和列,并且建立了一个新的列表用来存放转置后的部分;
2)将转置后对应的部分放在新建立的矩阵的对应位置即可。
6.将一维数组转变成二维数组(2022)
class Solution:
def construct2DArray(self,original:List[int],m:int,n:int)->List[List[int]]:
if len(original)!=m*n:
return []
ans=[[0]*n for _ in range(m)]
for i in range(m*n):
ans[i//n][i%n]=original[i]
return ans
本题里面重要的难点在于转换公式,第七行;
1)判断m*n与一维列表的长度是否相等;
2)将其看作一维的,利用变换公式将其放在相应的位置上即可。
7.判断矩阵经轮转后是否一致(1886)
class Solution:
def findRotation(self,mat:List[List[int]],target:List[List[int]])->bool:
n=len(mat)
for k in range(4):
for i in range(n//2):
for j in range((n+1)//2):
temp=mat[i][j]
mat[i][j]=mat[n-j-1][i]
mat[n-j-1][i]=mat[n-i-1][n-j-1]
mat[n-i-1][n-j-1]=mat[j][n-i-1]
mat[j][n-i-1]=temp
if mat==target:
return True
return False
1)首先返回矩阵的宽度;
2)一个矩阵最多旋转四次就回到原来的矩阵,在这个期间如果没有与目标相等,则就不可能相等了;
3)顺时针旋转的方法与前面的一样,搬过来即可。
8.二维网格迁移(1260)
class Solution:
def shiftGrid(self,grid:List[List[int]],k:int)->List[List[int]]:
count=1
m=len(grid)
n=len(grid[0])
while count<=k:
ans=[[0]*n for _ in range(m)]
for i in range(m):
for j in range(n-1):
ans[i][j+1]=grid[i][j]
for i in range(m-1):
ans[i+1][0]=grid[i][n-1]
ans[0][0]=grid[m-1][n-1]
grid=ans
count+=1
return grid
这个题目就是需要分别对三项操作进行独立操作。
写在后面
今天的题目还是挺多的,不过有很多的题目在九日集训里已经刷过了,有一些题目是单纯的对矩阵进行变换,而有的题目则是包含了这些方法并将其应用在实际题目中。