LeetCode: 330. 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:
Input: nums = [1,3], n = 6
Output: 1
Explanation:
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:
Input: nums = [1,5,10], n = 20
Output: 2
Explanation: The two patches can be [2, 4].
Example 3:
Input: nums = [1,2,2], n = 5
Output: 0
解题思路
- 遇到的第一个无法拼成的数字, 记为
x
,一定需要加入数字来解决, 我们可以贪心的加入x
- 由于前面数字组合以及可以组成
1
到(x-1)
的数字,当加入x
后,我们就可以直接跟之前的数字组合成x
到2x-1
, 所以我们就可以直接从2x
开始找第一个无法拼成的数字 - 如果
nums
没有用完,如果可以,我们需要跳到nums
的下一个。这样才能更多的使用nums
AC 代码
// 1. 遇到的第一个无法拼成的数字, 记为 x,一定需要加入数字来解决,
// 我们可以贪心的加入 x
// 2. 由于前面数字组合以及可以组成 1 到 (x-1) 的数字,当加入 x 后,
// 我们就可以直接跟之前的数字组合成 x 到 2x-1, 所以我们就可以直接
// 从 2x 开始找第一个无法拼成的数字
// 3. 如果 nums 没有用完,如果可以,我们需要跳到 nums 的下一个。这样
// 才能更多的使用 nums
func minPatches(nums []int, n int) int {
count := 0
cur := 0
idx := 0
for cur < n {
if idx < len(nums) && nums[idx] <= cur+1 {
cur += nums[idx]
idx++
} else {
count++
cur = cur * 2 + 1
}
}
return count
}