分析 miss记录当前集合已经完成[0, miss)所有组合。 当前值nums[i]小于等于miss时,表示在集合中增加nums[i]可以使组合范围增大到[0, miss+nums[i])。 当前值nums[i]大于miss时,增加nums[i]并不能让集合覆盖[0, miss+nums[i]),此时最好的方法是加miss,使得范围增大到[0, 2 * miss)。 class Solution { public: int minPatches(vector<int>& nums, int n) { long miss = 1; int ret = 0, i = 0; while (miss <= n) { if (i < nums.size() && nums[i] <= miss) { miss += nums[i++]; } else { miss <<= 1; ++ret; } } return ret; } };