前往
大廳
主題

LeetCode - 1818. Minimum Absolute Sum Difference 解題心得

Not In My Back Yard | 2022-12-30 12:00:08 | 巴幣 0 | 人氣 115

題目連結:


題目意譯:
你被給定兩正整數陣列 nums1 和 nums2,兩者的長度皆為 n。

num1 和 num2 兩陣列之間的絕對差值定義為 |nums1[i] - num2[i]| 之總和,對於每一個 i 值滿足 0 ≦ i < n(索引值從 0 開始)。

你可以將 num1 最多一個元素替換成任何一個位於 nums1 中的其他元素來最小化絕對差值。

回傳藉由替換 nums1 中最多一個元素之後可以得到的最小絕對差值。由於答案可能很大,將其模 10 ^ 9 + 7 後回傳。

|x| is defined as:
x if x ≧ 0, or
-x if x < 0.

限制:
n == nums1.length
n == nums2.length
1 ≦ n ≦ 10 ^ 5
1 ≦ nums1[i], nums2[i] ≦ 10 ^ 5



範例測資:
範例 1:
輸入: nums1 = [1,7,5], nums2 = [2,3,5]
輸出: 3
解釋: 有兩種可能的最佳解:
- 將第二個元素替換成第一個元素:[1,7,5] => [1,1,5],或
- 將第二個元素替換成第三個元素:[1,7,5] => [1,5,5]。
兩者都將得到絕對差值 |1-2| + (|1-3| 或 |5-3|) + |5-5| = 3。

範例 2:
輸入: nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]
輸出: 0
解釋: nums1 等於 nums2,所以不需要任何替換。這將得到絕對差值 0。

範例 3:
輸入: nums1 = [1,10,4,4,2,7], nums2 = [9,3,5,1,7,4]
輸出: 20
解釋: 將第一個元素替換成第二個元素:[1,10,4,4,2,7] => [10,10,4,4,2,7]。
兩者都將得到絕對差值 |10-9| + |10-3| + |4-5| + |4-1| + |2-7| + |7-4| = 20。


解題思維:
把 nums1 複製一份,並將其排序(小到大,或大到小都可以),我們稱其為 copied。

然後我們窮舉 nums1 每一個元素 nums1[i],來試著把 nums1[i] 替換成盡可能接近 nums2[i] 的兩個元素。而這兩個元素我們可以使用 copied 進行二分搜尋最接近 nums2[i] 的兩個元素。

然後把每一種替換所得到的總和絕對差值取最小值即是所求。




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

創作回應

更多創作