思路
第一次写解题思路,尽量尝试写得仔细一点~
- 相加的过程可以看成是一个搭桥的过程,如果从1开始到n一个不漏的都能表示,那就搭成一个完整的桥。例如1和2可以从1搭到3. 定义一个上限值max用于表示桥的上限,那么在1,2的例子中max=4.
- 如果此时加入一个数字,那么能表示的数字就会发生变化。
如果加入1/2/3/4, 那么桥的上限就会相应增加1/2/3/4.
如果加入5或者更大的数,此时桥无法连起来,因此需要添加其他数字。此时很显然需要添加上一种情况里面最大的数4,让桥的上限尽可能大 - 总结起来就是:
max=能连续表示的最大数+1
只有当前值小于等于max时才能继续延长max,否则需要额外添加max
代码
class Solution {
public int minPatches(int[] nums, int n) {
int max=1,res=0;
if(nums.length>0)//防止数组为空报错
for(int i=0;i< nums.length;i++){
if(max>n) return res;//此时已经能够产生大于等于n的值,结束
if(nums[i]<=max){
max+=nums[i];//如果max达到了当前的值,那么就可以把max继续延长
}
else{
res++;
max*=2;
i--;//如果max没有达到当前的值,就手动加上max,并且i要减1退回去
}
}
//nums中的值遍历完也无法产生n时,后面全靠添加的数,此时就要执行后面的for循环
//这里我用的判定条件是n/2,是为了防止溢出,所以后面才有一个额外的判断
//感觉这里用的不是太优雅,逻辑上有点臃肿,但是为了通过测试就这样了
for(;max<=n/2;res++,max*=2){}
if(max>n/2&&max<=n) res++;
return res;
}
}