地图跳跃-超级码力
给定n×n
的地图,每个单元都有一个高度,每次你只能够往相邻的单元格移动,并且要求这两个单元格的高度差不超过target
。你不能走出地图之外。求出满足从左上角(0,0)走到右下右下角(n-1,n-1)最小的target
。
例 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次方。 有更好快的方法可以交流。