冲冲冲!!!
1310. 子数组异或查询(前缀异或)
一开始使用暴力解法直接就超时了。
若平均查询需要执行n/2次,m次查询就是m*n/2,时间复杂度O(m*n),时间复杂度相当的高。
这里是与前缀和相似的解法。
前缀和:有一串数字,需要求从 下标L 到下标R(L<=R)的和。
这里规定和的数组中,零号元素是0.以方便后来进行相减操作。
前缀异或:相同地,将前R个先异或,然后再进行将前面的元素进行异或。类似于前缀和的减前边的数。
# 模板
class Solution:
def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:
Xor = [0,]
for i in arr:
Xor.append(Xor[-1]^i)
ans = []
for i in queries:
l, r = i
ans.append(Xor[r+1]^Xor[l])
return ans
LCP 07. 传递信息
这是一道离散数学题,邻接矩阵和可达矩阵的应用。
**原理:**A是一个邻接矩阵,若An表示点与点之间距离为n的路线的条数。
代码或许有些稚嫩,大佬们一笑而过就行了~
class Solution:
def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
matrix = [[0 for i in range(n)] for _ in range(n)] # 准备建立邻接矩阵
for x, y in relation: # 建立邻接矩阵
matrix[x][y] = 1
ans_matrix = copy.deepcopy(matrix) # 这个用来做矩阵乘法的,先拷贝一个
for _ in range(k-1): # 由于传递1次本身就是邻接矩阵,所以传递k次只需要乘k-1次
ans_matrix = self.matrixTimes(ans_matrix, matrix, n)
return ans_matrix[0][-1]
def matrixTimes(self, ans_matrix, matrix, n):
"""
进行矩阵乘法运算
"""
M = [[0 for i in range(n)] for _ in range(n)] # 准备承接结果
for i in range(n):
for j in range(n):
a = 0
for m in range(n):
a += ans_matrix[i][m]*matrix[m][j]
M[i][j] = a
return M # 返回矩阵乘法结果