330. 按要求补齐数组#
问题描述#
给定一个已排序的正整数数组 nums,和一个正整数 n 。从
[1, n]
区间内选取任意个数字补充到 nums 中,使得[1, n]
区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。示例 1:
输入: nums =
[1,3]
, n =6
输出: 1 解释: 根据 nums 里现有的组合[1], [3], [1,3]
,可以得出1, 3, 4
。 现在如果我们将2
添加到 nums 中, 组合变为:[1], [2], [3], [1,3], [2,3], [1,2,3]
。 其和可以表示数字1, 2, 3, 4, 5, 6
,能够覆盖[1, 6]
区间里所有的数。 所以我们最少需要添加一个数字。示例 2:
输入: nums =
[1,5,10]
, n =20
输出: 2 解释: 我们需要添加[2, 4]
。示例 3:
输入: nums =
[1,2,2]
, n =5
输出: 0
解题思路#
用 \(a_0,a_1,\cdots\) 表示排好序的 \(\texttt{nums}\)。
如果 \(a_0,a_1,\cdots,a_{i-1}\) 最多能够覆盖 \([1,x-1]\) 内的所有数,
那么对于 \(x\) 和 \(a_i\),
- 如果 \(a_i\gt x\),那么 \(\texttt{nums}\) 无法得到 \(x\),因为 \(x\) 只能由 \(\le x\) 的数得到,所以此时必须添加 \(x\) 这个数,在添加了 \(x\) 后,能够覆盖的范围由 \([1,x-1]\) 变为了 \([1,x-1+x]\Rightarrow[1,2x-1]\)。
- 如果 \(a_i\le x\),那么添加 \(a_i\) 后,能够覆盖的范围变为了 \([1,x-1+a_i]\)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|