前往
大廳
主題

LeetCode - 2578. Split With Minimum Sum 解題心得

Not In My Back Yard | 2024-02-02 12:00:01 | 巴幣 0 | 人氣 65

題目連結:


題目意譯:
給定一個正整數 num,請將其分成兩個非負整數 num1 和 num2 使得:
num1 和 num2 串接後是 num 的一個排列。

換句話說,每一種數字在 num1 和 num2 的出現次數總和等於該數字在 num 中的出現次數。

num1 和 num2 可以包含前導零。

回傳最小可能的 num1 和 num2 之和。

注:
保證 num 不包含任何前導零。
num1 和 num2 中的數字出現順序可以與 num 中數字出現順序不同。

限制:
10 ≦ num ≦ 10 ^ 9



範例測資:
範例 1:
輸入: num = 4325
輸出: 59
解釋: 我們可以將 4325 分拆使得 num1 為 24 而 num2 為 35,其總和為 59。我們可以證明 59 是所有可能當中最小的總和值。

範例 2:
輸入: num = 687
輸出: 75
解釋: 我們可以將 687 分拆使得 num1 為 68 而 num2 為 7。其將會給出一個最佳總和 75。


解題思維:
(令 n 為 num 之長度)
可以看到要總和盡量小,應當要把 num 盡量切成一半。

因此如果 n 是奇數,則分拆後有一個數字是 (n + 1) ÷ 2 位數長、另一個則是 (n - 1) ÷ 2 位數長;如果 n 是奇數,則兩數皆為 n ÷ 2 位數長。

而在這些所有可能的「平均」分拆之數字分配中,兩個分拆出來的數字要滿足從最高位到最低位是非嚴格遞增,才會有可能是最佳的。例如說,比起 num1 = 978,你應當選 num1 = 789 才比較好(不一定是最佳)。

所以我們可以先把 num 的位數排序。令由小到大的順序為 x1 、 x2 、 …… 、 xn。



首先如果 n 是偶數,則 x1 、 x3 、 …… 、xn-1 應分給某一數,而 x2 、 x4 、 …… 、 xn 應分給另一數。例如說,num = 1123,則第一個 1 和 2 要給 num1,而剩下的數字給 num2。這會得到總和 = 12 + 13 = 25,而這是最小的。

原因很簡單,兩數的最高位應當去挑所有數字中最小的兩個、次高位要挑剩下的最小兩個……以此類推。

所以實際上可以看到每一個對齊的位數是可以交換的,例如說 x1 與 x2 交換、x5 與 x6 交換等,結果是不會變的(因為如同前面所述,每次挑都是最小的兩個)。

那如果 n 是奇數呢?這也很單純,先把最小的數字隨便分給某個數字(num1 或 num2 皆可),接下來就按照偶數方式處理即可。




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

創作回應

更多創作