LOADING

加载过慢请开启缓存 浏览器默认开启

算法题记录Day2

第一阶段:基础递归理解「返回值+1」的结构

  1. Leetcode 104. 二叉树的最大深度
    https://leetcode.cn/problems/maximum-depth-of-binary-tree/
    目标:理解如何从叶子往回返回「深度」值
    关键词:return 1 + max(dfs(left), dfs(right))
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        dep=max(root.right,root.left)+1
        return dep

报错。。。
。。。。。
傻逼没加迭代。。。。不知道在些什么

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        dep=max(self.maxDepth(root.right),self.maxDepth(root.left))+1
        return dep
  1. Leetcode 733. 图像渲染(Flood Fill)
    https://leetcode.cn/problems/flood-fill/
    目标:理解如何用 DFS 走遍一张图
    关键词:探索四个方向,递归不返回值,但有“已访问”逻辑

非常的简单嗷,闭眼写,然后就报错了。。。:

class Solution:
    def floodFill(self, image: List[List[int]], sr: int, sc: int, color: int) -> List[List[int]]:
        func=[(0,1),(0,-1),(1,0),(-1,0)]
        m=len(image)
        n=len(image)
        old_color=image[sr][sc]
        def dfs(r,c):
            if image[r][c]==color or r >= m or r < m or c >= n or c < n :
                return 
            if image[r][c] == old_color :
                image[r][c] = color
            
            for i,j in func:
                dfs(r+i,c+j)
        dfs(sr,sc)
        return image

边界条件错了,但是通过例只有170/253


def dfs(r,c):
    if r>=m or r<0 or c >=n or c<0 or image[r][c]==color or image[r][c]!=old_color:

.....

........没休息好导致的,漏了一个小东西
上面的代码中俩个都是一样的

m=len(image)
n=len(image[0])

✅ 第二阶段:路径型递归 + 返回路径长度

  1. Leetcode 329. 矩阵中的最长递增路径
    https://leetcode.cn/problems/longest-increasing-path-in-a-matrix/
    目标:你现在研究的就是这个题目!
    关键词:1 + dfs(...),方向遍历 + 记忆化

写出来了,但是报错out of list,应该把判断长度的放在最前面

class Solution:
    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        m=len(matrix)
        n=len(matrix[0])
        mat=[[0]*n for _ in range(m)]
        di=[(0,1),(0,-1),(1,0),(-1,0)]
        def dfs(i,j,step):
            if mat[i][j]!=0:
                return mat[i][j]
            if i>=m or j>=n or i<0 or j<0:
                return step-1
            cur_res=step
            for o,k in di:
                nxt=dfs(i+o,j+k,step+1)
                if nxt>cur_res:
                    cur_res=nxt
            return cur_res

        res=-inf
        for i in range(m):
            for j in range(n):
                cur_res=dfs(i,j,1)
                if cur_res>=res:
                    res=cur_res

改了一版本,加上了限制和判断,还是报错。。。尝试debug

。。。。还是没改对,记录下来,下次再写。。。

先补上一共正确版本:
(算法有不同的写法,全忘掉再重新写就好了orz

class Solution:
    def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
        m=len(matrix)
        n=len(matrix[0])
        mat=[[0]*n for _ in range(m)]
        di=[(0,1),(0,-1),(1,0),(-1,0)]
        def dfs(i,j,pre):
            if i>=m or j>=n or i<0 or j<0 or pre>=matrix[i][j]:
                return 0
            if mat[i][j]!=0:
                return mat[i][j]
            cur_res=0
            for o,k in di:
                cur_res=max(cur_res,dfs(i+o,j+k,matrix[i][j])+1)
            mat[i][j]=cur_res
            return cur_res

        res=-inf
        for i in range(m):
            for j in range(n):
                res=max(res,dfs(i,j,-inf))
        return res
                
  1. Leetcode 62. 不同路径(递归版)
    https://leetcode.cn/problems/unique-paths/
    目标:练习“从当前格子出发有几条路径到终点”
    关键词:return dfs(i+1,j) + dfs(i,j+1)

这题下次再做

  1. Leetcode 198. 打家劫舍(带返回值的DP递归)
    https://leetcode.cn/problems/house-robber/
    目标:理解“当前选择 = 子问题最大值 + 当前值”
    关键词:dp[i] = max(dp[i-1], dp[i-2] + nums[i])

时刻记得当前的dfs和dp要干啥!

class Solution:
    def rob(self, nums):
        n=len(nums)
        memo = {}
        def dfs(i):#在第i个做什么操作?返回什么?
            if i >=n:
                return 0
            if i in memo:
                return memo[i]
            cur=nums[i]+dfs(i+2)#吃当前的
            nocur=dfs(i+1)#吃下一个,不吃当前的
            memo[i]=max(cur,nocur)
            return memo[i]
        return dfs(0)
    def robdp(self,nums):#dp[i]=第i个的最大金额
        #
        n=len(nums)
        dp=[0]*(n+1)#dp[i]=max(dp[i-2]+nums[i],dp[i-1])
        #dp[0]=nums[0],dp[1]=max(nums[0],nums[1])
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2,n):
            dp[i]=max(dp[i-2]+nums[i],dp[i-1])
        return dp[n-1]

#nums = [2,7,9,3,1]
nums = [1,2,3,1]
r=Solution().rob(nums)
dp=Solution().robdp(nums)
print(r)
print(dp)