【算法零基础100讲题解】第三讲 矩阵——基于Python语言

写在前面

今天是周六,题目是关于一些矩阵以及矩阵的操作的;
矩阵的定义在线性代数课本中有;
除此之外,今天的题目会涉及到矩阵的一些其他操作;矩阵的水平翻转、垂直翻转、矩阵的顺时针、逆时针旋转、矩阵的转置。

题目解析

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

这个题目就是需要分别对三项操作进行独立操作。

写在后面

今天的题目还是挺多的,不过有很多的题目在九日集训里已经刷过了,有一些题目是单纯的对矩阵进行变换,而有的题目则是包含了这些方法并将其应用在实际题目中。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUSE_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值