前往
大廳
主題

LeetCode - 2449. Minimum Number of Operations to Make Arrays Similar 解題心得

Not In My Back Yard | 2023-09-15 12:00:18 | 巴幣 0 | 人氣 88

題目連結:


題目意譯:
你被給定兩個正整數陣列 nums 和 target,兩者長度相同。

在一次操作中,你可以選擇任兩個相異索引值 i 和 j,其中 0 ≦ i 、 j < nums.length 並且:
將 nums[i] 設為 nums[i] + 2 以及
將 nums[j] 設為 nums[j] - 2。

兩陣列如果每一種元素的出現次數都一樣,則兩陣列視為「相似的」。

回傳 nums 與 target 變成相似的最少所需操作次數。測資之生成滿足 nums 永遠都可以與 target 相似。

限制:
n == nums.length == target.length
1 ≦ n ≦ 10 ^ 5
1 ≦ nums[i], target[i] ≦ 10 ^ 6
nums 保證可能與 target 相似。



範例測資:
範例 1:
輸入: nums = [8,12,6], target = [2,14,10]
輸出: 2
解釋: 可以在兩次操作中使 nums 與 target 變為相似:
- 選擇 i = 0 和 j = 2,nums = [10,12,4]。
- 選擇 i = 1 和 j = 2,nums = [10,14,2]。
可以證明 2 為最少所需操作次數。

範例 2:
輸入: nums = [1,2,5], target = [4,1,3]
輸出: 1
解釋: We can make nums similar to target in one operation:
- 選擇 i = 1 和 j = 2,nums[1,4,3]。

範例 3:
輸入: nums = [1,1,1,1,1], target = [1,1,1,1,1]
輸出: 0
解釋: 陣列 nums 已經與 target 相似了。


解題思維:
可以看到題目定義的操作並不會更動到數字的奇偶性。因此,我們可以把 nums 和 target 兩陣列中各自的奇數和偶數分開討論。

而因為題目保證可以讓 nums 變成與 target 相似,因此 nums 中的奇數之數量一定會和 target 中的奇數之數量相等。兩者的偶數數量也是同理。

因此以下我們先討論奇數的情況:
    先將 nums 、 target 兩者各自的奇數元素由小排到大。並分別以 x1 、 x2 、…… 和 y1 、 y2 、…… 各自指涉 nums 和 target 的數字。

    接著我們可以看到 x1 應與 y1 配對。因為如果存在一個最佳解中有另一數會先減少(或增加)至 x1 再到 y1,則我們可以直接用 x1 替換其角色即可(也就是說用 x1 去與 y1 配對不會比較差,還可能更好)。

    同理,x2 應與 y2 配對、x3 與 y3 配對、……

    接著我們再掃過一次每一個配對 (xi, yi),每當 xi ≧ yi,我們直接忽略這個配對;而當 xi < yi 時,我們便計算出 xi 變成 yi 所需的操作次數,即 (yi - xi) ÷ 2 次。因為題目的定義,有一數增加必有另一數減少。那我們剛剛算出的操作次數中該減少的數字(們)應為何?
    
    答案是,我們不需要知道。正因為題目保證 nums 可以變得與 target 相似,代表著我們此時的數字增加量必定可以對應到某些數字的減少量之總和。而這也是為何我們可以直接忽略掉 xi ≧ yi 的情況,因為我們不需要額外算這些配對的所需次數,xi < yi 已經做完了。

以上,我們便可以得到所有 nums 中的奇數與 target 中的奇數變為相似的最少所需次數。而偶數也是同理。最後將奇數的結果與偶數的結果加總即為所求。




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

創作回應

更多創作