[LeetCode] Patching Array

Posted 自在时刻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] Patching Array相关的知识,希望对你有一定的参考价值。

题目

Given a sorted positive integer array nums and an integer n, add/patch elements to the array such that any number in range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of patches required.

Example 1:
nums = [1, 3], n = 6
Return 1.
Combinations of nums are [1], [3], [1,3], which form possible sums of: 1, 3, 4.
Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3].
Possible sums are 1, 2, 3, 4, 5, 6, which now covers the range [1, 6].
So we only need 1 patch.
Example 2:
nums = [1, 5, 10], n = 20
Return 2.
The two patches can be [2, 4].
Example 3:
nums = [1, 2, 2], n = 5
Return 0.

解题思路

要凑齐1到n全部数字,我们可以记录一个序列, [1,miss) 表示已经凑齐了1,2,3…miss-1这些数,miss是目前要凑的最小的数。

凑齐当前miss有两个来源:一个是所给nums数组中数字任意和,一个是补充的新的数字。
那么现在,假设已经有1,2,3…miss-1这些数了,为了凑miss分以下情况:
1、从nums中拿出一个没用过的最小数num,如果num<=miss,那么num可以和1,2,3…miss-1这些数求和从而得到miss,miss+1…miss+num-1这些数,新的要凑齐的最小数就是miss+num。
2、nums当前的数num>miss,因为nums有序,所以后续全部的数都大于miss。这样miss无法由num求和组成,所以只能补充(patch)。这样,相当于来了一个新的数miss,同样可和1,2,3…miss-1进行求和获取miss,miss+1…2miss-1这些数,所要获取的最小数变为 2miss。

这样一直直到miss达到n,我们从左到右凑齐了全部的数。如果要获取更小的patch数,那么必然要去除某一个patch,而这个patch由不能由nums中的数获取,所以必然造成有数缺失。可以证明是最小解。

代码如下:

public class Solution 
    public int minPatches(int[] nums, int n) 
        int cnt = 0;
        long miss = 1;
        int i = 0;
        while (miss <= n) 
            if (i<nums.length && nums[i] <= miss)
                miss += nums[i++];
            else 
                cnt++;
                miss += miss;
            
        
        return cnt;
    

以上是关于[LeetCode] Patching Array的主要内容,如果未能解决你的问题,请参考以下文章

leetcode笔记:Patching Array

[LeetCode] Patching Array 补丁数组

LeetCode "Patching Array" !!!

[LeetCode]Patching Array

[LeetCode] Patching Array

Leetcode 330: Patching Array