Patching Array
Problem
Given a sorted positive integer array nums
and an integer n
, add/patch elements to the array such that any number in range [1, n]
inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.
Example #1
nums = [1, 3]
, n = 6
Return 1.
Combinations of nums are [1], [3], [1,3]
, which form possible sums of: 1, 3, 4
.
Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3]
.
Possible sums are 1, 2, 3, 4, 5, 6
, which now covers the range [1, 6]
.
So we only need 1 patch.
Example #2
nums = [1, 5, 10], n = 20
Return 2.
The two patches can be [2, 4].
Example #3
nums = [1, 2, 2], n = 5
Return 0.
Solution
Greedy.
Assume there is not any element in array.
[] -> []
, the next missing value is 1
.
[1] -> [1]
, the next missing value is 2
.
[1, 2] -> [1, 2, 3]
, the next missing value is 4
.
[1, 2, 4]
-> [1, 2, 3, 4, 5, 6, 7]
, the next missing value is 8
.
The greedy idea here is to get as many values as possible. Meanwhile, if we already can get values [1, k]
and add a new value p
, we are supposed to get [1, k]
and [p, p+k]
. If p <= k+1
, it would be [1, p+k]
.
For example, [1, 1, 5, 10]
and n = 20
.
[] -> []
, the next missing value is 1
, and 1
is in given array.
[1] -> [1]
, there is another 1 <= max value
, so we can get [1, 1]
, 1
, and [2, 2]
.
[1, 1] -> [1, 2]
, the next missing value is 3
. Add 3
.
[1, 1, 3] -> [1, 2, 3, 4, 5]
, In array, 5 <= max value
in range, so we can get [1, 5]
, 5
and [6, 10]
.
[1, 1, 3, 5] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
, Then we get [1, 10]
, 10
and [11, 20]
.
[1, 2, 3, 5, 10] -> [1, 2,..., 20]