Patching Array

hard greedy math

Problem

Given a sorted array nums and an integer n, return the minimum number of patches (additional numbers) needed so every value in [1, n] is representable as a sum of some subset of the array.

Inputnums = [1,3], n = 6
Output1
Patch in 2 → reach grows to 1+2+3=6; all of 1..6 are reachable.

def min_patches(nums, n):
    miss = 1
    i = patches = 0
    while miss <= n:
        if i < len(nums) and nums[i] <= miss:
            miss += nums[i]; i += 1
        else:
            miss += miss; patches += 1
    return patches
function minPatches(nums, n) {
  let miss = 1n, patches = 0, i = 0, N = BigInt(n);
  while (miss <= N) {
    if (i < nums.length && BigInt(nums[i]) <= miss) {
      miss += BigInt(nums[i]); i++;
    } else {
      miss += miss; patches++;
    }
  }
  return patches;
}
class Solution {
    public int minPatches(int[] nums, int n) {
        long miss = 1; int i = 0, patches = 0;
        while (miss <= n) {
            if (i < nums.length && nums[i] <= miss) { miss += nums[i]; i++; }
            else { miss += miss; patches++; }
        }
        return patches;
    }
}
int minPatches(vector& nums, int n) {
    long long miss = 1;
    int i = 0, patches = 0;
    while (miss <= n) {
        if (i < (int)nums.size() && (long long)nums[i] <= miss) { miss += nums[i]; i++; }
        else { miss += miss; patches++; }
    }
    return patches;
}
Time: O(log n + m) Space: O(1)