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
}

本文介绍了解决LeetCode 330题目的方法,该题目要求找到使数组能够覆盖从1到n的所有数字所需的最小补丁数。通过贪心算法,文章详细解释了如何高效地找到解决方案。

444

被折叠的 条评论
为什么被折叠?



