LeetCode330按要求补齐数组(Java)

LeetCode330 按要求补齐数组

思路

第一次写解题思路,尽量尝试写得仔细一点~

  1. 相加的过程可以看成是一个搭桥的过程,如果从1开始到n一个不漏的都能表示,那就搭成一个完整的桥。例如1和2可以从1搭到3. 定义一个上限值max用于表示桥的上限,那么在1,2的例子中max=4.
  2. 如果此时加入一个数字,那么能表示的数字就会发生变化。
    如果加入1/2/3/4, 那么桥的上限就会相应增加1/2/3/4.
    如果加入5或者更大的数,此时桥无法连起来,因此需要添加其他数字。此时很显然需要添加上一种情况里面最大的数4,让桥的上限尽可能大
  3. 总结起来就是:
    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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值