Leetcode每日刷题【中】--Day 6

冲冲冲!!!

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  # 返回矩阵乘法结果

你可能感兴趣的:(Leetcode,leetcode)