- 写在前面
- 题目解析
- 1.最富有客户的资产总量(1672)
- 2.二进制矩阵中的特殊位置(1582)
- 3.翻转图像(832)
- 4.旋转图像(48)
- 5.转置矩阵(867)
- 6.将一维数组转变成二维数组(2022)
- 7.判断矩阵经轮转后是否一致(1886)
- 8.二维网格迁移(1260)
- 写在后面
今天是周六,题目是关于一些矩阵以及矩阵的操作的;
矩阵的定义在线性代数课本中有;
除此之外,今天的题目会涉及到矩阵的一些其他操作;矩阵的水平翻转、垂直翻转、矩阵的顺时针、逆时针旋转、矩阵的转置。
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
这个题目就是需要分别对三项操作进行独立操作。
写在后面今天的题目还是挺多的,不过有很多的题目在九日集训里已经刷过了,有一些题目是单纯的对矩阵进行变换,而有的题目则是包含了这些方法并将其应用在实际题目中。



