leetcode 576题目

问题:

具体的问题可以看:https://leetcode.com/problems/out-of-boundary-paths/

解答:

两种方法的思路其实是一样的,但是迭代比递归要快。

从计算量的角度看:

result_list[time][i][j] 表示,在i,j这个位置,能进行time次移动时的结果。

result_list[N][i][j] 即为所求结果。

迭代需要计算result_list[N][0~m-1][0~n-1],而迭代只需要result_list[N][i][j]

我觉得计算量应该会更大,但是实际结果还是迭代比较快, 可能是递归本身的消耗比较大吧。

注意: python的深复制和浅复制

class Solution:
    def findPaths(self, m, n, N, in_i, in_j):
        """
        :type m: int
        :type n: int
        :type N: int
        :type i: int
        :type j: int
        :rtype: int
        """
        # 空间换时间
        # result_list[time][i][j] 表示,在i,j这个位置,且能进行times移动时的结果
        # result_list[time][i][j] = result_list[time-1][i-1][j] +   
        #                           result_list[time-1][i+1][j] +
        #                           result_list[time-1][i][j-1] +
        #                           result_list[time-1][i][j+1] //(如果出界,替换为1。)
        #                            
        # 创建存放的数组[time][i][j]

        # 方法1:迭代形式
        # 特殊情况
        if N==0:
            return 0
        import copy
        # 创建result_list
        l_n = [0 for j in range(n)]
        l_m = [copy.deepcopy(l_n) for i in range(m)]
        result_list = [copy.deepcopy(l_m) for t in range(N+1)]
        MOD = 1000000007
        for time in range(1,N+1):
            for i in range(m):
                for j in range(n):
                    count = 0
                    if i-1>=0:
                        count = count+result_list[time-1][i-1][j]
                    else:
                        count = count+1

                    if i+1<m:
                        count = count+result_list[time-1][i+1][j]
                    else:
                        count = count+1

                    if j-1>=0:
                        count = count+result_list[time-1][i][j-1]
                    else:
                        count = count+1

                    if j+1<n:
                        count = count+result_list[time-1][i][j+1]
                    else:
                        count = count+1
                    
                    result_list[time][i][j] = count % MOD

        return result_list[N][in_i][in_j]

"""
        # 方法2 递归 比较慢 超时
        # 递归函数
        def get_count(m, n, i ,j, time, result_list):
            MOD = 1000000007
            count = 0
            if time==1:
                #print("case1")
                count = result_list[1][i][j]
            else:
                if result_list[time][i][j]!=0 :
                    #print("case2")
                    # 之前计算过,空间换时间
                    count = result_list[time][i][j]
                else:
                    #print("case3")
                    #向上
                    if i-1>=0:
                        count = count + get_count(m, n, i-1 ,j, time-1, result_list)
                    else:
                        count = count + 1
                    #向下
                    if i+1<m:
                        count = count + get_count(m, n, i+1 ,j, time-1, result_list)
                    else:
                        count = count + 1
                    #向左
                    if j-1>=0:
                        count = count + get_count(m, n, i ,j-1, time-1, result_list)
                    else:
                        count = count + 1
                    #向右
                    if j+1<n:
                        count = count + get_count(m, n, i ,j+1, time-1, result_list)
                    else:
                        count = count + 1

            result_list[time][i][j]=count%MOD
            #print(i,j,time,count)
            return result_list[time][i][j]

        import copy
        # 特殊情况
        if N==0:
            return 0
        # 创建result_list
        l_n = [0 for j in range(n)]
        l_m = [copy.deepcopy(l_n) for i in range(m)]
        result_list = [copy.deepcopy(l_m) for t in range(N+2)]
        # 初始化
        if m==1 and n==1:
            result_list[1][0][0] = 4

        if n==1 and m>1:
            for i in range(1,m-1):
                result_list[1][i][0] = 2
            result_list[1][0][0] = result_list[1][m-1][0] = 3

        if m==1 and n>1:
            for j in range(1,n-1):
                result_list[1][0][j] = 2
            result_list[1][0][0] = result_list[1][0][n-1] = 3

        if m>1 and n >1:
            result_list[1][0][0]     =2
            result_list[1][0][n-1]   =2
            result_list[1][m-1][0]   =2
            result_list[1][m-1][n-1] =2
            for i in range(1,m-1):
                result_list[1][i][0] = result_list[1][i][n-1] =1
            for j in range(1,n-1):
                result_list[1][0][j] = result_list[1][m-1][j] =1
        return get_count(m, n, in_i ,in_j, N, result_list)
"""
#=====================
s = Solution()
#print(s.findPaths(2,2,2,0,0)) #return 6
#print(s.findPaths(1,3,3,0,1)) #return 12
#print(s.findPaths(2,3,8,1,0)) #return 1104
#print(s.findPaths(3,2,5,1,1))  #return 109
#print(s.findPaths(3,2,5,1,1))  #return 109
#print(s.findPaths(30,24,23,26,12))

猜你喜欢

转载自blog.csdn.net/zhangshuaiisme/article/details/85058537
今日推荐