给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1 n] 区间内选取任意个数字补充到 nums 中,使得 [1 n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。

所以我们最少需要添加一个数字。

这道题核心点正如标题所言: 贪心 + 维护端点信息。

贪心的思想这里不多说了,思路和官方题解是一样的。

先不考虑需要增加数字的情况,即没有任何缺失的数字。

这里给了几个例子方便大家理解。

左侧是 nums 数组, 右侧是 nums 可以覆盖的区间 [start end] (注意是左右都闭合)。当然如果你写出别的形式,比如左闭右开,那么代码要做一些调整。

接下来,我们考虑有些数字缺失导致无法覆盖的情况。

如果数组当前数字无法达到前缀和,那么需要补充数字,更新区间为 [1 前缀和]。

如果数组当前数字无法达到前缀和,则什么都不需要做。

那么第二步补充数字的话需要补充什么数字呢?如果当前区间是 [1x],我们应该添加数字 x + 1,这样可以覆盖的区间为 [12*x+1]。如果你选择添加小于 x + 1 的数字,达到的效果肯定没这个区间大。这就是贪心的思想。

如果你的区间信息是左闭右开的,代码可以这么写: