# **Leetcode筆記(Path With Minimum Effort)**
:::info
:information_source: 題目 : Path With Minimum Effort, 類型 : graph, 等級 : medium
日期 : 2023/12/01
:::
### 嘗試
```python
```
---
### **優化**
用binary search 去找目標最小值,用這個目標最小值去走dfs
```python
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
n, m = len(heights), len(heights[0])
dirs = [(0, 1), (1, 0), (-1, 0), (0, -1)]
def dfs(r, c, limitEffort):
if r == n - 1 and c == m - 1:
return True
if r < 0 or c < 0 or r >= n or c >= m or (r, c) in visited:
return False
visited.add((r, c))
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < m: # check if inside the boundary
if abs(heights[nr][nc] - heights[r][c]) <= limitEffort:
if dfs(nr, nc, limitEffort):
return True
l, r = 0, 10 ** 6
while l <= r:
mid = (l + r) // 2
visited = set() # has to renew it every time
if dfs(0, 0, mid):
r = mid - 1
else:
l = mid + 1
return l
```
we could use Dijkstra's Algorithm which is used to find the shortest path in a weighted graph with a slight modification of criteria for the shortest path.
永遠先pop調最小effort的,無論和當前走的path沒任何關係,這樣能確保到達終點時,effort是最小值
```python
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
n, m = len(heights), len(heights[0])
dirs = [(0, 1), (1, 0), (-1, 0), (0, -1)]
minHeap = [[0, 0, 0]] # [effort, r, c]
visited = set()
while minHeap:
effort, r, c = heapq.heappop(minHeap)
if r == n - 1 and c == m - 1:
return effort
visited.add((r, c))
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < n and 0 <= nc < m and (nr, nc) not in visited:
newEffort = max(effort, abs(heights[r][c] - heights[nr][nc]))
heapq.heappush(minHeap, [newEffort, nr, nc])
```
---
**思路**
**講解連結**
https://www.youtube.com/watch?v=XQlxCCx2vI4
Provided by. Neetcode