This problem is part of the Introduction to Data Structures Arrays-101 section in LeetCode.

## Problem Statement

Given an array arr of integers, check if there exists two integers N and M such that N is the double of M ( i.e. N = 2 * M).

More formally check if there exists two indices i and j such that :

- i != j
- 0 <= i, j < arr.length
- arr[i] == 2 * arr[j]

**Example 1**

```
Input: arr = [10,2,5,3]
Output: true
Explanation: N = 10 is the double of M = 5,that is, 10 = 2 * 5.
```

**Example 2**

```
Input: arr = [7,1,14,11]
Output: true
Explanation: N = 14 is the double of M = 7,that is, 14 = 2 * 7.
```

**Example 3**

```
Input: arr = [3,1,7,11]
Output: false
Explanation: In this case does not exist N and M, such that N = 2 * M.
```

**Constraints:**

- 2 <= arr.length <= 500
- -10^3 <= arr[i] <= 10^3

## First thought - Solution 1: two loops

```
var checkIfExist = function(arr) {
for(let i=0;i<arr.length;i++){
let target = arr[i]
for(let j=i+1;j<arr.length;j++){
if(target === arr[j]*2 || target === arr[j]/2){
return true
}
}
}
return false
};
```

**Time complexity** : O(nĀ²)

**Space complexity** : O(n)

## Solution 2: hash table

We could also use `hash table`

data structure to solve this problem using Set object or array.

- Iterate over the array and check if element in array multiplied by 2 or divided by 2 is equal to the element in the
`Set`

object. - If existed, then return true
- If not existed, then add the element in the Set object.

```
var checkIfExist = function (arr){
let newSet = new Set()
for(let i=0;i<arr.length;i++){
if(newSet.has(arr[i]/2) || newSet.has(arr[i]*2)){
return true
}else{
newSet.add(arr[i])
}
}
return false
}
```

NOTE: considering 0 in array

- [0,0] - output is True
- [0,10,7,1] - output is False

**Time complexity** : O(n)

For each element, we try to find its match in the Set object by looping through the array which takes O(n) time.

**Space complexity** : O(n)

The space complexity is O(n) because it needs a variable newSet to store the data.

## Discussion