leetcode_62 不同路径

dfs方法,每一个点为起点的路径个数等于他下方和右方点为起点的路径个数相加.
就是一个从中间向一个方向深入的过程。
由于递归超时,需要记忆化.

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        direction=[(0,1),(1,0)]
        di=[[-1]*n for _ in range(m)]


        def dfs(i,j):

            if i==m-1 or j==n-1:

                return 1
            if di[i][j]!=-1:
                return di[i][j]

            di[i][j]= dfs(i+1,j)+dfs(i,j+1)
            return di[i][j]

        return dfs(0,0)

另一种dfs 写法.

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        direction=[(0,1),(1,0)]
        dic=[[0]*n for _ in range(m)]

        def dfs(i,j):
            if i==m-1 or j==n-1:
                return 1
            if dic[i][j]!=0:
                return dic[i][j]

            for di in direction:
                x=i+di[0]
                y=j+di[1]
                if 0<=x<m and 0<=y<n:

                    dic[i][j]+=dfs(x,y)

            return dic[i][j]

        return dfs(0,0)

动态规划,从底向上的dfs

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        direction=[(0,1),(1,0)]
        dp=[[0]*n for _ in range(m)]

        for i in range(m):
            dp[i][n-1]=1

        for j in range(n):
            dp[m-1][j]=1

        for i in range(m-2,-1,-1):
            for j in range(n-2,-1,-1):

                dp[i][j]=dp[i+1][j]+dp[i][j+1]

        return dp[0][0]

状态压缩,只用一行

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:

        dp=[ 1 for _ in range(n)]



        for i in range(m-2,-1,-1):
            for j in range(n-2,-1,-1):

                dp[j]=dp[j]+dp[j+1]

        return dp[0]
全部评论

相关推荐

06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
点赞 评论 收藏
分享
frutiger:逆天,我家就安阳的,这hr咋能说3k的,你送外卖不比这工资高得多?还说大厂来的6k,打发叫花子的呢?这hr是怎么做到说昧良心的话的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务