google面试题之数组补丁

题目如下:给出一个从小到大排好序的整数数组nums和一个整数n,在数组中添加若干个补丁(元素)使得[1,n]的区间内的所有数都可以表示成nums中若干个数的和。返回最少需要添加的补丁个数。
Example 1:
nums = [1, 3], n = 6
返回1,表示至少需要添加1个数{2},才可以表示1到6之间所有数。
Example 2:
nums = [1, 5, 10], n = 20
返回2,表示至少需要添加两个数{2,4},才可以表示1到20之间所有数。

代码思路如下:定义一个变量missing表示[0,n]之间最小的当前数组和不能表示的数,初始化为1,那么此时能表示的数的范围是[0,missing),如果此时的num<=missing,那么当前能表示数的范围可扩大为[0,missing+num),如果num>missing,那么当前需要添加一个数,为了能最大限度地增加表示的数的范围,我们加上missing本身,以此类推直至遍历完整个数组。

JavaScript代码如下:

function minPatches(nums,n){
    var missing = 1, num = 0, i = 0, len = nums.length;
    while(missing <= n){
      if(i < len && nums[i] <= missing){
        missing += nums[i];
        i++;
      }else{
        missing += missing;
        num++;
      }
    }
    return num;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值