題目連結:
題目意譯:
你被給定一整數陣列 nums 以及一整數 k。在 nums 中加入 k 個沒有出現於 nums 中的相異正整數,並使得 nums 中的數字總和最小。
回傳加到 nums 中的這個 k 個整數之總和。
限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9
1 ≦ k ≦ 10 ^ 8
範例測資:
範例 1:
輸入: nums = [1,4,25,10,25], k = 2
輸出: 5
解釋: 我們加入 nums 中並且沒有出現於 nums 的兩個相異整數為 2 和 3。
結果之 nums 總和為 1 + 4 + 25 + 10 + 25 + 2 + 3 = 70,而這個是最小值。
加入的整數之總和為 2 + 3 = 5,所以我們回傳 5。
範例 2:
輸入: nums = [5,6], k = 6
輸出: 25
解釋: 我們加入 nums 中並且沒有出現於 nums 的六個相異整數為 1 、 2 、 3 、 4 、 7 和 8。
結果之 nums 總和為 5 + 6 + 1 + 2 + 3 + 4 + 7 + 8 = 36,而這個是最小值。
加入的整數之總和為 1 + 2 + 3 + 4 + 7 + 8 = 25,所以我們回傳 25。
解題思維:
我們先將 nums 中的數字由小排到大。
因為要使 nums 的最終總和最小,因此加入的數字應越小越好。
所以我們可以從 < nums[0](此為排序後,所以是 nums 中的最小值)的正整數開始加入,也就是 1 ~ nums[0] - 1 這些數字。注意到我們不需要真的「加到」nums 之中,我們只需要最後加入的數字之總和,因此可以直接用算的把這些數字加到總和裡即可。
如果不夠 k 個數字的話,就加入介於 nums[0] 到 nums[1] 之間的數字,即 nums[0] + 1 ~ nums[1] - 1;還是不夠就加入介於 nums[1] 到 nums[2] 之間的數字……以此類推。
如果最後掃完 nums 之後還是不夠 k 個(假設還需要 C 個數字),則代表剩下要加入的數字必定大過「nums 最大值」(假設該值為 X),即 X + 1 ~ X + C 這 C 個數字。
以上。我們便可以在 O(nums.length) 之內把總和求出來。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。