990 等式方程的可滿足性 leetcode

2021-10-06 23:07:36 字數 1715 閱讀 5847

給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations[i] 的長度為 4,並採用兩種不同的形式之一:"a==b" 或 "a!=b"。在這裡,a 和 b 是小寫字母(不一定不同),表示單字母變數名。

只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false。

示例 1:

輸入:[

"a==b","b!=a"

]輸出:false

解釋:如果我們指定,a = 1 且 b = 1,那麼可以滿足第乙個方程,但無法滿足第二個方程。沒有辦法分配變數同時滿足這兩個方程。

示例 2:

輸出:[

"b==a","a==b"

]輸入:true

解釋:我們可以指定 a = 1 且 b = 1 以滿足滿足這兩個方程。

示例 3:

輸入:[

"a==b","b==c","a==c"

]輸出:true

示例 4:

輸入:[

"a==b","b!=c","c==a"

]輸出:false

示例 5:

輸入:[

"c==c","b==d","x!=z"

]輸出:true

根據題目我們可以很清楚的知道我們需要使用 圖 的演算法,而這個題目我們只需要保證他們在同一集合內就可以,所以使用並查集更合適,當然如果直接構造一張圖也不是不可以,當時要使用搜尋演算法,從時間上來說並不合適;

class

solution

intfind

(int x)

void

unionset

(int x,

int y)

}bool

equationspossible

(vector

& equations)

bool re =

true

;for

(auto it = equations.

begin()

; it != equations.

end();

++it)

else

}return re;}}

;

最初級的並查集實際上

int uset[

500]

;void

makeset

(int size)

intfind

(int x)

void

unionset

(int x,

int y)

但實際上這個演算法的缺陷很明顯, 隨著集合的不斷增大,樹不斷變深,搜尋所花費的時間將越來越大

所以優化方式有兩種

void

unionset

(int x,

int y)

}

按軼插入,我們總是將軼較小的樹插在軼較大的樹下面,這樣可以防止樹不斷變深,增加搜尋耗時;

單元素的樹的秩定義為0,當兩棵秩同為r的樹聯合時,它們的秩r+1(軼和深度不同,軼不等於深度,wiki是這麼寫的。。。我也不知道為什麼)

int

find

(int x)

路徑壓縮,將搜尋路徑上的每個節點,直接指向根節點。

990 等式方程的可滿足性 medium

給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false...

LeetCode 990 等式方程的可滿足性 中等

給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false...

Leetcode 990 等式方程的可滿足性

給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false...