前往
大廳
主題

LeetCode - 2392. Build a Matrix With Conditions 解題心得

Not In My Back Yard | 2023-07-20 12:00:01 | 巴幣 1000 | 人氣 97

題目連結:


題目意譯:
你被給定一正整數 k。你同時也被給定:
一個大小為 n 的二維整數陣列 rowConditions,其中 rowConditions[i] = [abovei, belowi],以及
一個大小為 m 的二維整數陣列 colConditions,其中 colConditions[i] = [lefti, righti]。

兩陣列都包含著介於 1 到 k 之間的整數。

你需要製造出一個 k × k 矩陣,其包含著 1 到 k 每個數字恰好一次。剩下的格子應有著數值 0。

該矩陣也應滿足以下條件:
對於所有從 0 到 n - 1 的 i 值,數字 abovei 所在列數應嚴格於 belowi 的所在列數之「上」。
對於所有從 0 到 m - 1 的 i 值,數字 lefti 所在行數應嚴格於 righti 的所在行數之「左」。
(譯者注:「上」不代表著數字比較大,請參見範例測資。)

回傳任意一個滿足條件的矩陣。如果不存在任何答案,則回傳一個空矩陣。

限制:
2 ≦ k ≦ 400
1 ≦ rowConditions.length, colConditions.length ≦ 10 ^ 4
rowConditions[i].length == colConditions[i].length == 2
1 ≦ abovei, belowi, lefti, righti ≦ k
abovei != belowi
lefti != righti



範例測資:
範例 1:
輸入: k = 3, rowConditions = [[1,2],[3,2]], colConditions = [[2,1],[3,2]]
輸出: [[3,0,0],[0,0,1],[0,2,0]]
解釋: 上圖顯示了一個符合所有條件的矩陣之合法範例。
關於列的條件為以下:
- 數字 1 在第 1 列,而數字 2 在第 2 列,所以在矩陣中 1 位於 2 之上。
- 數字 3 在第 0 列,而數字 2 在第 2 列,所以在矩陣中 3 位於 2 之上。
關於行的條件為以下:
- 數字 2 在第 1 行,而數字 1 在第 2 行,所以在矩陣中 1 位於 2 之左。
- 數字 3 在第 0 行,而數字 2 在第 1 行,所以在矩陣中 3 位於 2 之左。
注意到可能存在著多個正確解答。

範例 2:
輸入: k = 3, rowConditions = [[1,2],[2,3],[3,1],[2,3]], colConditions = [[2,1]]
輸出: []
解釋: 從前兩個條件,3 必須位在 1 的下面,但是根據第三個條件 3 必須位於 1 之上。
沒有矩陣可以滿足所有條件,所以我們回傳空陣列。


解題思維:
把 rowConditions 和 colConditions 各自建成兩個有向圖後,可以發現本題基本上跟這題很類似。我們只要根據拓樸排序(Topological Sort)來指派列數和行數給 1 ~ k 的每個數字(當然,行和列的兩張圖要分開做,同時一起並不實際)。

只要過程中發現有數字沒有被指派到對應的列或行,也就是說某張圖有環,則代表我們不可能得到一個符合所有條件的矩陣。因此此時便可以回傳空矩陣。

而如果都沒有問題的話,則就把每個數字放在對應的行列,然後把矩陣中剩餘位置填入數字 0,即可得到所求。




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

創作回應

更多創作