Find the Missing Number

Another week has passed so let’s discuss a new algorithm. For this problem, we want to find a missing number inside of an array. The number we want is the smallest possible positive integer that is missing inside of the array. For example, let’s look at an array

var A = [1, 3, 6, 4, 1, 2]. 

When we sort it, the array is

[1,1,2,3,4,6],

and we can see the missing link is 5. Let’s look at another array

[1,2,3].

We want the answer to return 4. And finally, for this array

[-3, -1],

we want to return 1.

The problem asks we write an efficient algorithm that will solve this problem. The first approach to getting there is doing it by brute force. What we want to do is start from 1 to the array length plus 1. If the number x does not exist inside of the array, return the first positive number. The code is simply

function missingNumber(arr){
for(var x = 1; x <= arr.length + 1; x++){
if(arr.indexOf(x) === -1){
return x
}
}
}.

It looks simple, but the problem is that the time complexity is O(n²). We want O(n). Now what can we do to make the problem more efficient? Let’s start by looking at our if-statement. The if statement is evaluating if x exists in the array so it behaves like another for loop.

To avoid the if statement acting like a for loop, let’s start by announcing a new variable

var min = 1

because we don’t want to go less than 1. Next, we sort the array

arr.sort(function(a, b){return a- b}). 

Then we go through the array arr and if the condition

arr[x] === min

is met, we add to min

min ++. 

Full code is

function solution(A) {         
var min = 1
A.sort(function(a, b){return a - b})
for(var x = 0; x < A.length; x++){
if( A[x] === min){
min++
}
}
return min
}.

The time complexity of this code is O(n) or O(n * log(n)).