ETH官方钱包

前往
大廳
主題

LeetCode - 2541. Minimum Operations to Make Array Equal II 解題心得

Not In My Back Yard | 2023-12-25 12:00:06 | 巴幣 0 | 人氣 86

題目連結(jié):


題目意譯:
你被給定兩個長度皆為 n 的整數(shù)陣列 nums1 和 nums2,以及一整數(shù) k。你可以在 nums1 執(zhí)行以下操作:
選出兩個索引值 i 和 j 來為 nums1[i] 之值增加 k 並將 nums[j] 之值減去 k。換句話說,nums1[i] = nums1[i] + k 且 nums1[j] = nums1[j] - k。

如果對於所有索引值 i,其中 0 ≦ i < n,將滿足 nums1[i] == nums2[i],則 nums1 等於 nums2。

回傳讓 nums1 等於 nums2 的最少所需操作數(shù)。如果不可能達(dá)成,則回傳 -1。

限制:
n == nums1.length == nums2.length
2 ≦ n ≦ 10 ^ 5
0 ≦ nums1[i], nums2[j] ≦ 10 ^ 9
0 ≦ k ≦ 10 ^ 5



範(fàn)例測資:
範(fàn)例 1:
輸入: nums1 = [4,3,1,4], nums2 = [1,3,7,1], k = 3
輸出: 2
解釋: 在 2 次操作中,我們可以 nums1 變成 nums2。
第一個操作:i = 2 、 j = 0。執(zhí)行操作後,nums1 = [1,3,4,4]。
第二個操作:i = 2 、 j = 3。執(zhí)行操作後,nums1 = [1,3,7,1]。
可以證明不可能用更少的操作數(shù)讓兩個陣列相等。

範(fàn)例 2:
輸入: nums1 = [3,8,5,2], nums2 = [2,4,1,6], k = 1
輸出: -1
解釋: 可以證明不可能讓兩個陣列相等。


解題思維:
首先,先同時掃過一次兩個陣列。只要存在著某個索引值 i 使得 nums1[i] % k 不等於 nums2[i] % k,其中「%」代表模運(yùn)算,則不可能讓兩陣列相等。因?yàn)閮蓴?shù)餘數(shù)不同便代表著無論加上或減去多少 k 都不可能會一樣。

接著,令 P 代表著對於所有滿足 nums2[i] > nums1[i] 的 (nums2[i] - nums1[i]) ÷ k 之值、而 N 代表著對於所有滿足 nums1[i] > nums2[i] 的 (nums1[i] - nums2[i]) ÷ k 之值。

可以看到 P 代表著我們總共需要為這些 nums1[i] 加上 k 的次數(shù),而 N 代表著為另外的(即與 P 相對的)那些 nums1[i] 減去 k 的次數(shù)。

而為了讓兩個陣列相等,代表著 P 應(yīng)等於 N(因?yàn)槲覀兛梢钥醋鍪菍⒛切┍粶p去 k 的元素們轉(zhuǎn)嫁它們的數(shù)值到需要加上 k 的元素們)。因此如果 P 不等於 N,則代表兩陣列不可能相等;反之,則代表最少只需要 P(即 N)次便可以使兩陣列相等。




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

創(chuàng)作回應(yīng)

追蹤 創(chuàng)作集

作者相關(guān)創(chuàng)作

更多創(chuàng)作