leetcode 399 除法求值

2021-10-08 21:27:43 字數 2170 閱讀 6048

查詢改進

給出方程式 a / b = k, 其中 a 和 b 均為用字串表示的變數, k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 -1.0。

示例 :

給定 a / b = 2.0, b / c = 3.0

問題: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?

返回 [6.0, 0.5, -1.0, 1.0, -1.0 ]

輸入為: vector> equations, vector& values, vector> queries(方程式,方程式結果,問題方程式), 其中 equations.size() == values.size(),即方程式的長度與方程式結果長度相等(程式與結果一一對應),並且結果值均為正數。以上為方程式的描述。 返回vector型別。

基於上述例子,輸入如下:

equations(方程式) = [ [「a」, 「b」], [「b」, 「c」] ],

values(方程式結果) = [2.0, 3.0],

queries(問題方程式) = [ [「a」, 「c」], [「b」, 「a」], [「a」, 「e」], [「a」, 「a」], [「x」, 「x」] ].

輸入總是有效的。你可以假設除法運算中不會出現除數為0的情況,且不存在任何矛盾的結果。

這道題目是圖的路徑問題,準確的說是森林的問題.圖上的路徑a/c就是(a/b) / (b/c)就是a->b->c只不過路徑的權值是乘法,但由於是樹,所以權值唯一.

可以使用dfs但是使用*****方法每次搜尋可能會掛,需要有記錄的dfs,或者使用弗洛伊德演算法,計算所有點之間的路徑,在此我使用的是並查集的方法.

這道題目和常規的並查集的區別是他帶有權值,而不是簡單的同類關係,題目分成兩個部分,並查集的建立,以及後面的查詢

因為這個需要有權值的記錄,所以使用weight來記錄點到根的比值,使用par來記錄父子關係,而這兩個值是一一對應的,就比如對於點c par[「c」]=「b」,weight[「c」]=10,就表示c點到自己的祖輩節點b的比值為10,這個b可能是上乙個節點,也可能是樹的根節點,但一定是c的祖輩這樣我們的weight有乙個依賴,不至於混亂.

遍歷所有的邊(a,b),首先檢查邊的兩點是否存在,不存在就建立乙個,之後檢查兩點是否是同乙個集合,

使用find函式可以得到乙個根節點和到根節點的比值,通過節點不斷向根節點回溯以及比值乘法進行

union函式合併兩個不屬於同一集合的樹,把乙個其中乙個的根節點當作另外乙個根節點的父節點,因為父子節點改變,weight也要改變權值.更新的公式weight[xx.first]=dyy.second/xx.second;

假設a/b=2,c/d=3,又知b/d=4,那麼經過a和c的比值就是(a/b)(b/d)/(c/d),就是上面的公式,其中

xx.second=c/d,就是不是作為主根節點的比值,yy.second=(a/b)

查詢就是很簡單的常規查詢,檢查兩點是否在同乙個集合中,在就權值相除,因為都是對於根節點來說的,不在就輸出-1.0

class

solution

; string tmp=p;

double div=

1.0;

while

(tmp!=par[tmp]

)return;}

bool

union1

(string x,string y,

double d)

vector<

double

>

calcequation

(vector>

& equations, vector<

double

>

& values, vector>

& queries)

if(par.

find

(b)==par.

end())

union1

(a,b,values[i]);

} vector<

double

> ans;

for(

int i=

0;isize()

;i++

)else

}"b"]]);

return ans;}}

;

leetcode399 除法求值

給出方程式 a b k,其中 a 和 b 均為代表字串的變數,k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 1.0。示例 給定 a b 2.0,b c 3.0 問題 a c b a a e a a x x 返回 6.0,0.5,1.0,1.0,1.0 輸入為 ...

leetcode 399 除法求值

399.除法求值 給出方程式 a b k,其中 a 和 b 均為用字串表示的變數,k 是乙個浮點型數字。根據已知方程式求解問題,並返回計算結果。如果結果不存在,則返回 1.0。示例 給定 a b 2.0,b c 3.0 問題 a c b a a e a a x x 返回 6.0,0.5,1.0,1....

帶權並查集 Leetcode 399 除法求值

構建帶權值邊的並查集,對於每個方程式有兩種情況 查詢是否聯通,若不聯通,則答案為 1.0 若聯通,則求出其與根相除的結果,根據結果計算方程式。例如,對於題目示例 構造並查集 a b c,其中a b的邊的權值為2.0,b c的邊的權值為3.0 以計算b a時為例,以root結點為橋梁,計算b a的值 ...