[LeetCode][JavaScript]Patching Array

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.

https://leetcode.com/problems/patching-array/


组合nums数组中的数字以填满[1, n]的范围,如果有空缺的组合数字,需要补patch到nums数组中,求最少需要几个patch。

https://leetcode.com/discuss/82822/solution-explanation

贪心,从小到大填满[1, n],能用原来的nums中的数的时候就用掉,不够就补patch。

举例来说,nums = [1, 5, 10], n = 40。

首先就缺少了2,patch补2,此时范围是[1, 3],即1 ∪ 2 ∪ 1 + 2。

这边还用不到5,patch补4,此时范围是[1, 7],即[1, 3] ∪ 4 ∪ [1 + 4, 3 + 4] 。

5在的[1, 7]的范围里,可以用上5,此时范围是[1, 12],即[1, 7] ∪ [1 + 5, 7 + 5] 。

10在的[1, 12]的范围里,用上10,此时范围是[1, 22],即[1, 12] ∪ [1 + 10, 12 + 10] 。

patch补23,此时范围是[1, 45],即[1, 22] ∪ 23 ∪ [1 + 23, 22 + 23] 。

最后需要3个patch[2, 4, 23]。

代码按照这个思路实现,先看nums里的数能不能用上,如果不行就加一个patch。

 1 /**
 2  * @param {number[]} nums
 3  * @param {number} n
 4  * @return {number}
 5  */
 6 var minPatches = function(nums, n) {
 7     var countPatch = 0, numsIndex = 0;
 8     for(var i = 1; i <= n;){
 9         if(nums[numsIndex] < i){
10             i += nums[numsIndex];
11             numsIndex++;
12             continue;
13         }            
14         if(nums[numsIndex] === i)
15             numsIndex++;
16         else
17             countPatch++;
18         if(i - 1 > 0)
19             i += i - 1;
20         i++;
21     }
22     return countPatch;
23 };
原文地址:https://www.cnblogs.com/Liok3187/p/5223236.html