leetcode刷题记录571-580 python版

前言

继续leetcode刷题生涯
这里记录的都是笔者觉得有点意思的做法
参考了好几位大佬的题解,感谢各位大佬

572. 另一个树的子树

class Solution:
    def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
        if not s and not t:
            return True
        if not s or not t:
            return False
        return self.isSameTree(s, t) or self.isSubtree(s.left, t) or self.isSubtree(s.right, t)
    def isSameTree(self, s, t):
        if not s and not t:
            return True
        if not s or not t:
            return False
        return s.val == t.val and self.isSameTree(s.left, t.left) and self.isSameTree(s.right, t.right)

575. 分糖果

class Solution:
    def distributeCandies(self, candies: List[int]) -> int:
        return len(set(candies)) if len(set(candies))<len(candies)//2 else len(candies)//2

576. 出界的路径数

# dp
class Solution:
    def findPaths(self, m: int, n: int, N: int, i: int, j: int) -> int:
        result=[]
        dp=[[[0]*(n+2) for a in range(m+2)] for b in range(N+1)]
        for c in range(m+2):
            for d in range(n+2):
                if c==0 or c==m+1 or d==0 or d==n+1:
                    dp[0][c][d]+=1
        for x in range(1,N+1):
            for y in range(1,m+1):
                for z in range(1,n+1):
                    dp[x][y][z]=dp[x-1][y-1][z]+dp[x-1][y+1][z]+dp[x-1][y][z-1]+dp[x-1][y][z+1]#状态方程
            result.append(dp[x][i+1][j+1])
        return sum(result)%1000000007
# 记忆化
from functools import lru_cache
class Solution:
    @lru_cache(None)
    def findPaths(self, m: int, n: int, N: int, i: int, j: int) -> int:
        if i < 0 or i >= m or j < 0 or j >= n: return 1
        if not N: return 0
        return sum(self.findPaths(m, n, N - 1, i + dx, j + dy) for dx, dy in ((0, 1), (0, -1), (1, 0), (-1, 0))) % (10 ** 9 + 7)

你可能感兴趣的:(leetcode)