前往
大廳
主題

LeetCode - 1685. Sum of Absolute Differences in a Sorted Array 解題心得

Not In My Back Yard | 2024-04-11 12:00:08 | 巴幣 0 | 人氣 45

題目連結:


題目意譯:
你被給定一按非遞減序排序之整數陣列 nums。

建立並回傳一個整數陣列 result,其長度與 nums 相等並使得 result[i] 等於 nums[i] 與 nums 其餘元素之絕對差值之總和。

換句話說,result[i] 等於 sum(|nums[i] - nums[j]|),其中 0 ≦ j < nums.length 且 j != i(索引值從 0 開始數)。

限制:
2 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ nums[i + 1] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: nums = [2,3,5]
輸出: [4,3,5]
解釋: 假設陣列索引值從 0 開始數,則
result[0] = |2-2| + |2-3| + |2-5| = 0 + 1 + 3 = 4、
result[1] = |3-2| + |3-3| + |3-5| = 1 + 0 + 2 = 3、
result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。

範例 2:
輸入: nums = [1,4,6,8,10]
輸出: [24,15,13,15,21]


解題思維:
首先我們先把 result[0] 直接算出來。沒什麼特別的,直接掃過剩餘元素並計算即可。

接著重複以下步驟直到結尾:
    假設現在已知 result[i - 1],而我們要算出 result[i] 之值,其中 i > 0。

    則我們可以比較 result[i - 1] 和 result[i] 兩者的數值便可以觀察得到從 nums[i - 1]「移動到」nums[i] 代表著我們將會
        「遠離」nums[0] 、 nums[1] 、 …… 、 nums[i - 1],並
        「靠近」nums[i] 、 nums[i + 1] 、 …… 、 nums[nums.length - 1]
    因此 result[i] 可以藉由 result[i - 1] 加上
        「位移量」×「遠離數字個數」 + 「位移量」×「靠近數字個數」
    而得。上式稍微化簡可得
        「位移量」×(「遠離數字個數」 + 「靠近數字個數」)
    而此即為
        (nums[i] - nums[i - 1]) × (i + (nums.length - i))
    因此 result[i] = result[i - 1] + (nums[i] - nums[i - 1]) × (i + (nums.length - i))。




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

創作回應

更多創作