题目来源
题目描述
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
}
};
题目解析
分析数据量
1 <= nums.length <= 1000
:
因此,dp就不太可能了。 暴力也很悬
思路
(1)先思考空数组怎么补齐最省
小结:
(2)现在给定了一个非空数组,要想补齐最少,那么每个数应该最经济的使用。
举个例子:
关于数组的使用有如下可能
- 首先,数据有可能完全不用(让arr[0] >> n)时
- 然后,数据可能只用一部分就搞定了n。这时,直接返回即可,不需要用剩下的数了
- 最后,数据可能用完了还没有搞定n。这时,相当于给定一个空数组,然后补齐n
我们只需要关系总目标有没有实现即可
代码如下:
class Solution {
public:
// arr请保证有序,且正数 1~aim
int minPatches(vector<int>& arr, int aim) {
int patches = 0; // 缺多少个数字
long range = 0; // 已经完成了1 ~ range的目标
for (int i = 0; i < arr.size(); ++i) {
// arr[i]
// 要求:1 ~ arr[i]-1 范围被搞定!
while (arr[i] - 1 > range) { // arr[i] 1 ~ arr[i]-1
range += range + 1; // range + 1 是缺的数字
patches++;
if (range >= aim) {
return patches;
}
}
// 要求被满足了!
range += arr[i];
if (range >= aim) {
return patches;
}
}
while (aim >= range + 1) {
range += range + 1;
patches++;
}
return patches;
}
};