前往
大廳
主題

LeetCode - 1879. Minimum XOR Sum of Two Arrays 解題心得

Not In My Back Yard | 2021-07-24 00:00:01 | 巴幣 0 | 人氣 274

題目連結:


題目意譯:
給定兩個長度為 n 的整數陣列 nums1 和 nums2 。

兩個整數陣列的 XOR 和為 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1]) + …… + (nums1[n - 1] XOR nums2[n - 1]) (索引值從 0 開始)。

例如,[1,2,3] 和 [3,2,1] 的 XOR 和為 (1 XOR 3) + (2 XOR 2) + (3 XOR 1) = 2 + 0 + 2 = 4 。

重新排列 nums2 的元素使得結果之 XOR 和盡可能地小。

回傳經過重新排列後的 XOR 和之值。

限制:
n == nums1.length
n == nums2.length
1 ≦ n ≦ 14
0 ≦ nums1[i] 、 nums2[i] ≦ 10 ^ 7



範例測資:
範例 1:
輸入: nums1 = [1,2], nums2 = [2,3]
輸出: 2
解釋: 重新排列 nums2 使其變成 [3,2]。
XOR 和為 (1 XOR 3) + (2 XOR 2) = 2 + 0 = 2 。

範例 2:
輸入: nums1 = [1,0,3], nums2 = [5,3,4]
輸出: 8
解釋: 重新排列 nums2 使其變成 [5,4,3]。
XOR 和為 (1 XOR 5) + (0 XOR 4) + (3 XOR 3) = 4 + 4 + 0 = 8 。


解題思維:
本題的動態規劃(Dynamic Programming)之遞迴式與旅行推銷員問題(Travelling Salesman Problem,TSP,參見這題)相當地類似。其形式為
DP[i][j] = min(nums1[i] XOR nums[k] + DP[i][j OR (1 << k)])
其中 DP[i][j] 代表著目前正處於 nums1[i] 而我們已經探訪過的 nums2[k] 之狀態為 j(以位元遮罩的形式表示)、 0 ≦ k < n 且 j & (1 << k) == 0 (代表 nums2[k] 尚未探訪)。

而這次的所求儲存於 DP[0][0] 之中,因為其代表著從 nums1[0] 開始到 nums1[n - 1] 為止,每個 nums1[i] 要與哪個 nums2[k] 配才能使得 XOR 和最小。




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

創作回應

更多創作