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.
Top comments (0)