地图跳跃-超级码力

描述

给定n×n的地图,每个单元都有一个高度,每次你只能够往相邻的单元格移动,并且要求这两个单元格的高度差不超过target。你不能走出地图之外。求出满足从左上角(0,0)走到右下右下角(n-1,n-1)最小的target

 n<=1000<a[i][j]<100000
 
示例

例 1:

输入:[[1,5],[6,2]],
输出:4,
解释:
有2条路线:
1. 1 -> 5 -> 2 这条路线上target为4。
2. 1 -> 6 -> 2 这条路线上target为5。
所以结果为4

例 2:

输入:[[1,5,9],[3,4,7],[6,8,1]],
输出:6

class Solution:
    """
    @param arr: the map
    @return:  the smallest target that satisfies from the upper left corner (0, 0) to the lower right corner (n-1, n-1)
    """
    def mapJump(self, arr):
        # Write your code here.
        maxd=100000
        n=len(arr)
        [i.insert(0,200000) for i in arr]
        [i.append(200000) for i in arr]
        arr.insert(0,[200000]*(n+2))
        arr.append([200000]*(n+2))
        op=[[maxd]*(n+2) for i in range(n+2)]
        op[1][1]=0
        for k in range(int(n**0.7)+1):
            for r in range(1,n+1):
                for c in range(1,n+1):
                    lr=r-1
                    rr=r+1
                    tc=c-1
                    dc=c+1
                    m1=max(op[lr][c],abs(arr[r][c]-arr[lr][c]))
                    m2=max(op[rr][c],abs(arr[r][c]-arr[rr][c]))
                    m3=max(op[r][tc],abs(arr[r][c]-arr[r][tc]))
                    m4=max(op[r][dc],abs(arr[r][c]-arr[r][dc]))
                    op[r][c]= min(m1,m2,m3,m4,op[r][c])
        
        return op[n][n]
        
我承认这个代码里的迭代次数k是试出来的,需要反复的迭代 当迭代 k=int(n**7)+1次时可以通过,实际上可能出问题,原来使用n,结果超时,后来反复修改k从 k**0.5 尝试到0.7成功了。

设计的时间复杂度是n的3次方。 有更好快的方法可以交流。

原文地址:https://www.cnblogs.com/yjphhw/p/13693530.html