原题:这里写链接内容
分析:一开始我的思路是这样,将所有未包含的数添加到一个set中,然后遍历nums集合,然后把可以组合起来的都去掉,显然了,这个超时,特别是当我看到有整数的最大数时,这个方法肯定就不能用了。
然后想不出什么好思路了,网上这种写法非常好,他是定义了一个值miss,表示当前可用表示的最大值(不包括),然后通过添加数来扩展这个miss,什么意思呢?假如说我当前可用表示为【1,100),那么现在如果num中有个数90,那么miss就可以扩展到【1,190),这个道理很显然吧,如果num中当前值比100大,也即这时候将会卡在100这里,所以我们通过添加数100,扩展miss到【1,200)。当然了res要加1,因为新增了一个数。这道题的思想是有点像贪心算法的。
public class Solution {
public int minPatches(int[] nums, int n) {
long miss = 1;
int index = 0;
int count = 0;
while(miss <= n){
if(index<nums.length && nums[index] <= miss){
miss += nums[index++];
}else{
miss *= 2;
count++;
}
}
return count;
}
}