假设我们有一个称为nums的数字列表,另一个值为k。我们必须找到需要插入到num中的最小数量的数字,以便我们可以使用num中的某些子集从[1,k]中得出任何数字。
因此,如果输入类似于nums = [3,5],k = 6,则输出将为2,因为我们必须插入1、2,所以我们可以使:1 = [1],2 = [2 ],3 = [3],4 = [1、3],5 = [5],6 = [1、5]。
为了解决这个问题,我们将遵循以下步骤-
对数组数字进行排序
sum:= 0,下一个:= 1,ret:= 0
对于我所有的数字
从循环中出来
如果总和> = k,则:
总和:=总和+下一个
下一个:= sum + 1
(增加ret 1)
从循环中出来
而下一个<i,请执行:
如果总和> = k,则:
和:=和+ i
下一个:= sum + 1
而下一个<= k,请执行以下操作:
总和:=总和+下一个
下一个:= sum + 1
(增加ret 1)
返回ret
让我们看下面的实现以更好地理解-
#include using namespace std; class Solution { public: int solve(vector& nums, int k) { sort(nums.begin(), nums.end()); int sum = 0; int next = 1; int ret = 0; for (int i : nums) { while (next < i) { if (sum >= k) break; sum += next; next = sum + 1; ret++; } if (sum >= k) break; sum += i; next = sum + 1; } while (next <= k) { sum += next; next = sum + 1; ret++; } return ret; } }; int solve(vector& nums, int k) { return (new Solution())->solve(nums, k); } int main(){ vector v = {3, 5}; int k = 6; cout << solve(v, k); }
[3, 5], 6
输出结果
2