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:
Input: nums =[1,3]
, n =6
Output: 1 Explanation: Combinations of nums are[1], [3], [1,3]
, which form possible sums of:1, 3, 4
. Now if we add/patch2
to nums, the combinations are:[1], [2], [3], [1,3], [2,3], [1,2,3]
. Possible sums are1, 2, 3, 4, 5, 6
, which now covers the range[1, 6]
. So we only need1
patch.
Example 2:
Input: nums =[1,5,10]
, n =20
Output: 2 Explanation: The two patches can be[2, 4]
.
Example 3:
Input: nums =[1,2,2]
, n =5
Output: 0
参考资料:here。
解决这道题关键是:如何在不出现间断的情况下最快地增加覆盖范围。
如果现在能够覆盖的范围是[1,N],那么应该增加哪个数来扩大覆盖范围呢?答案是N+1。因为这样才不会出现覆盖范围间断的情况。
另外需要注意,使用nums中的数来扩大覆盖范围是“免费”的,所以当nums[i]<=N+1时,可以使用nums[i]来扩大覆盖范围。
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
int max_range(0), add_count(0), current_pos(0);
while (max_range < n) {
if (current_pos < nums.size() && nums[current_pos] <= max_range + 1) {
max_range += nums[current_pos++];
}
else {
add_count++;
max_range += max_range + 1;
}
}
return add_count;
}
};