1. 程式人生 > 實用技巧 >地圖跳躍-超級碼力

地圖跳躍-超級碼力

描述

給定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,結果超時,後來反覆。

設計的時間複雜度是n的3次方。 有更好快的方法可以交流。