本文已参与「新人创作礼」活动,一起开启掘金创作之路
题目
Given a sorted integer array nums and an integer n, add/patch elements to the array such that any number in the 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
Constraints:
1 <= nums.length <= 1000 1 <= nums[i] <= 104 nums is sorted in ascending order. 1 <= n <= 231 - 1
链接:leetcode-cn.com/problems/pa…
题解
参考代码注释即可。
class Solution:
def minPatches(self, nums: List[int], n: int) -> int:
# nums[:i]+patches could cover every number < needCover
# at first, nums[:0]+[] could cover nothing, i.e. needCover = 1
needCover, i = 1, 0
# the number of patch we used
patches = 0
while i < len(nums):
if needCover >= n+1: return patches
if nums[i] <= needCover:
# in this case
# nums[:i]+patches could cover < needCover
# nums[:i+1]+patches could cover < needCover+nums[i]
# (here nums[:i+1] == nums[:i] + nums[i])
needCover += nums[i]
i += 1
else:
# in this case
# nums[:i]+patches could cover < needCover
# but nums[:i+1]+patches could not cover needCover+nums[i]
# so introduce patch: needCover
# nums[:i]+patches+patch could cover < 2*needCover
patches += 1
needCover *= 2
while needCover <= n:
# in this case
# nums+patches could cover < needCover
# but could not cover n
# so introduce patch: needCover
# nums+patches+patch could cover < 2*needCover
patches += 1
needCover *= 2
return patches