Missing Element in Sorted Array

medium binary search sorted array math

Problem

Given an integer array nums which is sorted in ascending order and all of its elements are distinct, and given an integer k, return the kth missing number starting from the leftmost number nums[0].

Inputnums = [4, 7, 9, 10], k = 3
Output8
The missing numbers in order are 5, 6, 8, 11, 12, … so the 3rd missing number is 8.

def missing_element(nums, k):
    n = len(nums)
    def missing(i):
        return nums[i] - nums[0] - i
    if k > missing(n - 1):
        return nums[n - 1] + k - missing(n - 1)
    lo, hi = 0, n - 1
    while lo < hi:
        mid = (lo + hi) // 2
        if missing(mid) < k:
            lo = mid + 1
        else:
            hi = mid
    return nums[lo - 1] + k - missing(lo - 1)
function missingElement(nums, k) {
  const n = nums.length;
  const missing = (i) => nums[i] - nums[0] - i;
  if (k > missing(n - 1)) return nums[n - 1] + k - missing(n - 1);
  let lo = 0, hi = n - 1;
  while (lo < hi) {
    const mid = (lo + hi) >> 1;
    if (missing(mid) < k) lo = mid + 1;
    else hi = mid;
  }
  return nums[lo - 1] + k - missing(lo - 1);
}
class Solution {
    public int missingElement(int[] nums, int k) {
        int n = nums.length;
        if (k > missing(nums, n - 1)) return nums[n - 1] + k - missing(nums, n - 1);
        int lo = 0, hi = n - 1;
        while (lo < hi) {
            int mid = (lo + hi) >>> 1;
            if (missing(nums, mid) < k) lo = mid + 1;
            else hi = mid;
        }
        return nums[lo - 1] + k - missing(nums, lo - 1);
    }
    private int missing(int[] nums, int i) {
        return nums[i] - nums[0] - i;
    }
}
int missingElement(vector<int>& nums, int k) {
    int n = nums.size();
    auto missing = [&](int i) { return nums[i] - nums[0] - i; };
    if (k > missing(n - 1)) return nums[n - 1] + k - missing(n - 1);
    int lo = 0, hi = n - 1;
    while (lo < hi) {
        int mid = (lo + hi) / 2;
        if (missing(mid) < k) lo = mid + 1;
        else hi = mid;
    }
    return nums[lo - 1] + k - missing(lo - 1);
}
Time: O(log n) Space: O(1)