problemeasyalgorithms

Find smallest missing number in sorted array

EasyUpdated: Aug 19, 2025

Problem

Given a sorted array of n distinct integers where each integer is in the range from 0 to m-1 and m > n, find the smallest number that is missing from the array.

Note: This is a special case of [Missing Element in Sorted Array](missing-element-in-sorted-array) with k=1.

Examples

Example 1

Input: nums = [0, 1, 2, 6, 9], n = 5, m = 10
Output: 3

Example 2

Input: [4, 5, 10, 11], n = 4, m = 12
Output: 0

Solution

Method 1 – Linear Scan

If arr[0] != 0, return 0. Otherwise, scan the array and return the first index where arr[i] != i. This approach takes O(n) time.

Method 2 – Modified Binary Search (Optimal)

This is the optimal approach for sorted arrays with distinct elements. Compare the value at each index with the index itself:

Code

C++
class Solution {
public:
    int findSmallestMissing(const vector<int>& arr) {
        return helper(arr, 0, arr.size() - 1);
    }
private:
    int helper(const vector<int>& arr, int start, int end) {
        if (start > end) return end + 1;
        if (arr[start] != start) return start;
        int mid = (start + end) / 2;
        if (arr[mid] == mid)
            return helper(arr, mid + 1, end);
        else
            return helper(arr, start, mid);
    }
};
Go
type Solution struct{}

func (s Solution) FindSmallestMissing(arr []int) int {
    var helper func(start, end int) int
    helper = func(start, end int) int {
        if start > end {
            return end + 1
        }
        if arr[start] != start {
            return start
        }
        mid := (start + end) / 2
        if arr[mid] == mid {
            return helper(mid+1, end)
        } else {
            return helper(start, mid)
        }
    }
    return helper(0, len(arr)-1)
}
Java
class Solution {
    public int findSmallestMissing(int[] arr) {
        return helper(arr, 0, arr.length - 1);
    }
    private int helper(int[] arr, int start, int end) {
        if (start > end) return end + 1;
        if (arr[start] != start) return start;
        int mid = (start + end) / 2;
        if (arr[mid] == mid)
            return helper(arr, mid + 1, end);
        else
            return helper(arr, start, mid);
    }
}
Python
from typing import List
class Solution:
    def findSmallestMissing(self, arr: List[int]) -> int:
        def helper(start: int, end: int) -> int:
            if start > end:
                return end + 1
            if arr[start] != start:
                return start
            mid = (start + end) // 2
            if arr[mid] == mid:
                return helper(mid + 1, end)
            else:
                return helper(start, mid)
        return helper(0, len(arr) - 1)

Complexity

  • ⏰ Time complexity: O(log n), because each step of the binary search halves the search space, leading to logarithmic time in the size of the array.
  • 🧺 Space complexity: O(1), as the algorithm uses only a constant amount of extra space for pointers/indices and recursion stack (if implemented recursively).

Continue Practicing

Comments