ETH官方钱包

前往
大廳
主題

LeetCode - 2151. Maximum Good People Based on Statements 解題心得

Not In My Back Yard | 2022-09-03 12:00:15 | 巴幣 0 | 人氣 247

題目連結:


題目意譯:
現在有兩種人:
好人:永遠都會說實話之人。
壞人:時而說謊,時而說實話之人。

你被給定一個索引值從 0 開始的二維 n × n 大小之整數陣列 statements,其代表著 n 個人對彼此的描述。更準確地說,statements[i][j] 可能為以下:
0,其代表著 i 這個人將 j 這個人描述成壞人。
1,其代表著 i 這個人將 j 這個人描述成好人。
2,其代表著 i 這個人對 j 這個人沒有做出敘述。

此外,沒有任何人會對自身做出描述。更正式地說,我們有著 statements[i][i] = 2,對於所有 i 值滿足 0 ≦ i < n。

回傳在根據 n 個人對彼此的描述的情況下,好人之個數最多是多少。

限制:
n == statements.length == statements[i].length
2 ≦ n ≦ 15
statements[i][j] 只會是 0 、 1 或是 2。
statements[i][i] == 2



範例測資:
範例 1:
輸入: statements = [[2,1,2],[1,2,2],[2,0,2]]
輸出: 2
解釋: 每個人都只做出一個描述。
- 0 這個人說 1 這個人是好人。
- 1 這個人說 0 這個人是好人。
- 2 這個人說 1 這個人是壞人。
讓我們把 2 這個人當作關鍵。
- 假設 2 這個人是好人:
    - 根據 2 這個人的描述,1 這個人是壞人。
    - 現在我們知道 1 是壞人而且 2 是好人。
    - 根據 1 這個人的描述,而且由於 1 是壞人,他可能會:
        - 說實話。這將造成矛盾,因此此假設不成立。
        - 說謊話。因此,0 這個人也是一個壞人,並且在描述的時候說謊。
    - 根據 2 這個人是好人,因此這個群體只有一個好人。
- 假設 2 這個人是壞人:
    - 根據 2 這個人的描述,而且由於 2 是壞人,他可能會:
        - 說實話。在這個情況下,跟前面的敘述相同,0 和 1 這兩個人都是壞人。
        - 說謊話。在這個情況下,1 是好人。
            - 由於 1 這個人是好人,0 這個人也同樣是一個好人。
            - 因此 2 這個人是壞人且說了謊,因此這個群體有兩個好人。
我們可以看到在最好的情況下有 2 個好人,因此回傳 2。
注意到,有多個方式可以推得此結論。

範例 2:
輸入: statements = [[2,0],[0,2]]
輸出: 1
解釋: 每個人都只做出一個描述。
- 0 這個人說 1 這個人是壞人。
- 1 這個人說 0 這個人是壞人。
讓我們把 0 這個人當作關鍵。
- 假設 2 這個人是好人:
    - 根據 0 這個人的描述,1 這個人是壞人且說了謊。
    - 根據 2 這個人是好人,因此這個群體只有一個好人。
- 假設 2 這個人是壞人:
    - 根據 0 這個人的描述,而且由於 0 是壞人,他可能會:
        - 說實話。在這個情況下,0 跟 1 這兩個人都是壞人。
            - 這個情況下,0 是壞人且說了實話,因此這個群體內沒有好人。
        - 說謊話。在這個情況下,1 是好人。
            - 這個情況下,0 是壞人且說了謊,因此這個群體只有一個好人。
我們可以看到在最好的情況下有 1 個好人,因此回傳 1。
注意到,有多個方式可以推得此結論。


解題思維:
我們可以事先把 n 個人各自是好人或是壞人的所有情況(2 ^ n 個)以及描述都窮舉出來。在這個過程中,所有好人都對其他人做出描述,而不會有描述是「2」的情況出現。

然後把每一種窮舉出來的好人分布以及描述與輸入給定的 statements 去比對,也就是好人們做出的敘述應去與 statements 中的對應位置檢查是否相符合(如果是「2」就當作是「符合」)。

最後只要看哪一種有符合之分布的好人人數最多即為所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作