地圖跳躍-超級碼力
阿新 • • 發佈:2020-09-18
描述
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×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))
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]))
op[r][c]= min(m1,m2,m3,m4,op[r][c])
return op[n][n]
我承認這個程式碼裡的迭代次數k是試出來的,需要反覆的迭代 當迭代 k=int(n**7)+1次時可以通過,實際上可能出問題,原來使用n,結果超時,後來反覆。
設計的時間複雜度是n的3次方。 有更好快的方法可以交流。