給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 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...