1631 最小體力消耗路徑

2021-10-18 07:39:16 字數 2346 閱讀 4642

你準備參加一場遠足活動。給你乙個二維 rows x columns 的地圖 heights ,其中 heights[row][col] 表示格仔 (row, col) 的高度。一開始你在最左上角的格仔 (0, 0) ,且你希望去最右下角的格仔 (rows-1, columns-1) (注意下標從 0 開始編號)。你每次可以往 上,下,左,右 四個方向之一移動,你想要找到耗費 體力 最小的一條路徑。

一條路徑耗費的 體力值 是路徑上相鄰格仔之間 高度差絕對值 的 最大值 決定的。

請你返回從左上角走到右下角的最小 體力消耗值

示例1

輸入:heights = [[1,2,2],[3,8,2],[5,3,5]]

輸出:2

解釋:路徑 [1,3,5,3,5] 連續格仔的差值絕對值最大為 2 。

這條路徑比路徑 [1,2,2,2,5] 更優,因為另一條路徑差值最大值為 3 。

1. bfs

類似於最短路徑

在bfs的同時去記錄到當前座標所需要消耗的體力值,由於到達乙個座標有多種方式,故我們用乙個陣列res去記錄到達當前座標所需的最小體力值初始化佇列

訪問隊頭元素

對於當前元素進行廣度優先搜尋,計算當前訪問點與cur與相鄰點next之間的差值是否大於起點到next的最小消耗體力值

若小於,則更新res中起點到達next所需要的最小體力值

遍歷完成後,返回res[row-1][col-1]則表示起點到終點所需的最小體力值

參考**

class

solution

;int

dy =

; priorityqueue<

int[

]> priqueue =

newpriorityqueue

<

int[

]>

(new

comparator

<

int[

]>()

}); priqueue.

offer

(new

int)

;int

res =

newint

[row]

[col]

;for

(int

cur : res)

res[0]

[0]=

0;boolean

visited =

newboolean

[row]

[col]

;while

(!priqueue.

isempty()

));}

}}return res[newx]

[newy];}

}

2. 並查集

把每個的格仔當前乙個點,則整個網格中有row*col個點,每個格仔對應的值作為其兩點連線的線權

將整個網格內的所有格仔,全部轉換為:兩個點與其線權這種形式,並按照線權進行排序

從小開始依次遍歷所有的點-邊式

如果該點-邊式的兩個點合併為乙個連通分量,並判斷起點到終點是否屬於乙個連通分量

重複步驟3

參考**

class

solution);

}if(j >0)

)}}}

collections.

sort

(edges,

newcomparator

<

int[

]>()

}); unionfind myunionfind =

newunionfind

(row * col)

;int ans =0;

for(

int[

] edge : edges)

}return ans;

}class

unionfind

}public

void

union

(int a,

int b)

else

parent[rootb]

= roota;}}

public

boolean

isconnected

(int a,

int b)

public

intfind

(int index)

return index;}}

}

1631 最小體力消耗路徑

1631.最小體力消耗路徑 你準備參加一場遠足活動。給你乙個二維rows x columns的地圖heights,其中heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從0開始編號 ...

1631 最小體力消耗路徑

你準備參加一場遠足活動。給你乙個二維 rows x columns 的地圖 heights 其中 heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從 0 開始編號 你每次可以往 上...

1631 最小體力消耗路徑

你準備參加一場遠足活動。給你乙個二維rows x columns的地圖heights,其中heights row col 表示格仔 row,col 的高度。一開始你在最左上角的格仔 0,0 且你希望去最右下角的格仔 rows 1,columns 1 注意下標從 0 開始編號 你每次可以往 上,下,左...