题目:
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
代码:
方法一——(超时):
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
vector<int> record;
for (int i = 0; i < nums.size(); i++) {
if (i == 0) {
record.push_back(nums[i]);
}
else {
int len = record.size();
for (int j = 0; j < len; j++) {
record.push_back(record[j] + nums[i]);
}
record.push_back(nums[i]);
}
}
int count = 0;
for (int i = 1; i <= n; i++) {
if (find(record.begin(), record.end(), i) == record.end()) {
int len = record.size();
for (int j = 0; j < len; j++) {
record.push_back(record[j] + i);
}
record.push_back(i);
count++;
}
}
return count;
}
};
方法二——:
int minPatches(vector<int>& nums, int n) {
long miss = 1, res = 0, i = 0;
while (miss <= n) {
if (i < nums.size() && nums[i] <= miss) {
miss += nums[i++];
}
else {
miss += miss;
++res;
}
}
return res;
}
想法:
用一个miss,记录能表示到的最大数。可以大大节省空间复杂度和时间复杂度。