題目可以轉化為:
是否存在一條路徑,該路徑上的體力值不超過x,可以從左上角到達右下角
假設x = x0時存在路徑可以從左上角到達右下角,那麼當x增大時原來的路徑仍然可以使用。因此可以使用二分查詢,每次估測乙個x,然後進行廣度或者深度優先搜尋,最後根據能否到達右下角來縮小搜尋範圍。
class
solution,,
,};public
intminimumeffortpath
(int
heights));
seen[0]
[0]=
true
;while
(!queue.
isempty()
)); seen[nx]
[ny]
=true;}
}}if(seen[rows -1]
[cols -1]
)else
}return ans;
}}
將這 rows * cols 個節點放入並查集中,實時維護它們的連通性。
由於我們需要找到從左上角到右下角的最短路徑,因此我們可以將圖中的所有邊按照權值從小到大進行排序,並依次加入並查集中。當我們加入一條權值為 x 的邊之後,如果左上角和右下角從非連通狀態變為連通狀態,那麼 x 即為答案。
class
solution);
}if(j >0)
);}}
} collections.
sort
(edges,
(o1, o2)
-> o1[2]
- o2[2]
);unionfind uf =
newunionfind
(rows * cols)
;int ans =0;
for(
int[
] edge : edges)
}return ans;
}class
unionfind
}public
intfind
(int x)
return parent[x];}
public
void
union
(int x,
int y)
public
boolean
connected
(int x,
int y)
}}
leetcode最小體力消耗路徑
你準備參加一場遠足活動。給你乙個二維 rows x columns 的地圖 heights 其中 heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從 0 開始編號 你每次可以往 上...
LeetCode 1631 最小體力消耗路徑
題目鏈結 你準備參加一場遠足活動。給你乙個二維 rows x columns 的地圖 heights 其中 heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從 0 開始編號 你每次...
1631 最小體力消耗路徑
1631.最小體力消耗路徑 你準備參加一場遠足活動。給你乙個二維rows x columns的地圖heights,其中heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從0開始編號 ...