330. Patching Array-数组补丁|贪心算法

本文介绍了一个基于贪心算法的应用——修复数组问题。通过逐步解析示例数组[1,2,3,8]的过程,详细解释了如何计算缺失值并确定需要多少个补丁来覆盖指定范围内的所有整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:330. Patching Array

【思路】

这是贪心算法的一个应用。举个例子,对于数组 [1, 2, 3, 8] :

1. 用一个miss来表示当前缺失的数,初始时为1,num[0] = 1,它的覆盖范围为 [1, 1] ,可以补足miss = 1

2.那么哪个数是num[0]达不到的呢?答案是:miss + nums[0] = 2。那么向数组申请一个新的数nums[1],它们的覆盖范围为 [1, 3] 发现可以补足miss = 2。

3.那么哪个数是它们两达不到的呢?答案是:miss + nums[1] = 4。那么向数组申请一个新的数nums[2],它们的覆盖范围为 [1, 6] 发现3可以补足miss = 4

4.那么哪个数是它们三达不到的呢?答案是:miss + nums[2] = 7。那么向数组申请一个新的数nums[3],发现由于8大于7,因此miss要自己申请一个7,此时由于7的加入,覆盖范围变为了 [1, 13]

5.那么下一个 [1, 2, 3, 7]达不到的呢?答案是:miss + miss(补丁7) = 14。由于8 < 14因此可以覆盖到14,且它们的覆盖范围变为[1, 21]

依此思维类推:

    public int minPatches(int[] nums, int n) {
        int patchCount = 0;
        int index = 0;
        long miss = 1;
        while (miss <= n) {
            if (index < nums.length && nums[index] <= miss) {
                miss += nums[index++];
            } else {
                miss += miss;
                patchCount++;
            }
        }
        return patchCount;
    }
149 / 149  test cases passed. Runtime: 1 ms  Your runtime beats 15.00% of javasubmissions.
欢迎优化!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值