前往
大廳
主題

LeetCode - 2412. Minimum Money Required Before Transactions 解題心得

Not In My Back Yard | 2023-08-09 12:00:04 | 巴幣 0 | 人氣 85

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的二維整數陣列 transactions,其中 transactions[i] = [costi, cashbacki]。

該陣列描述了若干筆交易,其中每筆交易必須以某種順序完成恰好一次。在任意時間點,你擁有著特定數量的金額 money。為了完成交易 i,money ≧ costi 必須為真(True)。在執行一次交易後,money 將變成 money - costi + cashbacki。

回傳在進行任何交易之前最少所需的金額 money,使得所有交易可以用任意順序全數完成。

限制:
1 ≦ transactions.length ≦ 10 ^ 5
transactions[i].length == 2
0 ≦ costi, cashbacki ≦ 10 ^ 9



範例測資:
範例 1:
輸入: transactions = [[2,1],[5,0],[4,2]]
輸出: 10
解釋:
以 money = 10 開始,這些交易可以用任意順序完成。
可以證明以 money < 10 開始將會在某些順序下無法完成。

範例 2:
輸入: transactions = [[3,0],[0,3]]
輸出: 3
解釋:
- 如果交易的順序是 [[3,0],[0,3]],完成所有交易最少所需金額為 3。
- 如果交易的順序是 [[0,3],[3,0]],完成所有交易最小所需金額為 0。
因此,以 money = 3 開始,所有交易可以用任意順序完成。


解題思維:
根據題目的定義,我們的目標最小金額需要滿足在任意順序下都可以完成所有交易。因此如果先進行過所有會虧損的交易,我們的金額應當依然不為負數。

因此我們先算出所有會虧損的金額值(稱其值為 L),即所有 costi - cashbacki 之總和,其中 costi > cashbacki(即虧損)。所以現在我們可以確定最小金額至少為 L。

再者,我們需要完成最後一筆會虧損的交易 [costi, cashbacki](costi > cashbacki)時,我們至少要有 L + cashbacki 的金額才能完成。因為我們的金額是賺得 cashbacki 之後才會與所有虧損打平。

那需要考慮最後兩筆、三筆等等的情況嗎?不用,以最後兩筆為例,在倒數第二筆的時候實際上需要的金額會比較少(這邊就略過代數的部分,有興趣的讀者可以自己推),而最後一筆就會回到上面的情況;而其他筆數也是同理。

因此我們只需要找出所有會虧損的交易中,L + cashbacki 之最大值(稱其值為 X)。

但是我們還有會獲利的交易要考慮。同樣地,我們需要考慮所有可能的順序,因此在撐過上面的虧損之後我們還需要能撐過這些會獲利的交易中 costi 最大者。所以我們需要找到這些交易中 L + costi 之最大值(稱其值為 Y)。

最後只要取 X 和 Y 兩者的最大值即為所求(因為一旦滿足當中最大者,便會可以撐過另一者的金額所需)。




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

創作回應

更多創作