2021-03-11 17:26:48 +01:00
|
|
|
# Challenge name: Two Sum
|
|
|
|
# Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
|
|
|
|
#
|
|
|
|
# You may assume that each input would have exactly one solution, and you may not use the same element twice.
|
|
|
|
#
|
|
|
|
# You can return the answer in any order.
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# Examples
|
|
|
|
#
|
|
|
|
# Input: nums = [2, 7, 11, 15], target = 9
|
|
|
|
# Output: [0,1]
|
|
|
|
# Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
|
|
|
|
#
|
|
|
|
# Input: nums = [3, 2, 4], target = 6
|
|
|
|
# Output: [1,2]
|
|
|
|
#
|
|
|
|
# Input: nums = [3, 3], target = 6
|
|
|
|
# Output: [0,1]
|
|
|
|
# Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].
|
|
|
|
#
|
|
|
|
# @param {Integer[]} nums
|
|
|
|
# @param {Integer} target
|
|
|
|
# @return {Integer[]}
|
|
|
|
|
|
|
|
#
|
2021-03-12 00:53:01 +01:00
|
|
|
# Approach 1: Brute Force with Addition
|
2021-03-11 17:26:48 +01:00
|
|
|
#
|
2021-03-11 18:20:26 +01:00
|
|
|
# Time Complexity: O(N^2), where N is the length of the array
|
2021-03-11 17:26:48 +01:00
|
|
|
#
|
|
|
|
def two_sum(nums, target)
|
|
|
|
result_array = []
|
|
|
|
|
|
|
|
nums.each_with_index do |num, i|
|
|
|
|
nums.each_with_index do |num, j|
|
|
|
|
if i != j && i < j
|
|
|
|
current_sum = nums[i] + nums[j]
|
|
|
|
if current_sum == target
|
2021-03-11 18:20:26 +01:00
|
|
|
return [i, j]
|
2021-03-11 17:26:48 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-03-11 18:20:26 +01:00
|
|
|
print two_sum([2, 7, 11, 15], 9)
|
|
|
|
# => [0,1]
|
|
|
|
print two_sum([3, 2, 4], 6)
|
|
|
|
# => [1,2]
|
|
|
|
print two_sum([3, 3], 6)
|
|
|
|
# => [0,1]
|
|
|
|
|
|
|
|
#
|
2021-03-12 00:53:01 +01:00
|
|
|
# Approach 2: Brute Force with Difference
|
2021-03-11 18:20:26 +01:00
|
|
|
#
|
|
|
|
# Time Complexity: O(N^2), where N is the length of the array
|
|
|
|
#
|
|
|
|
def two_sum(nums, target)
|
|
|
|
nums.each_with_index do |num, i|
|
|
|
|
target_difference = target - nums[i]
|
|
|
|
nums.each_with_index do |num, j|
|
|
|
|
if i != j && num == target_difference
|
|
|
|
return [i, j]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-03-12 00:53:01 +01:00
|
|
|
print two_sum([2, 7, 11, 15], 9)
|
|
|
|
# => [0,1]
|
|
|
|
print two_sum([3, 2, 4], 6)
|
|
|
|
# => [1,2]
|
|
|
|
print two_sum([3, 3], 6)
|
|
|
|
# => [0,1]
|
|
|
|
|
|
|
|
#
|
|
|
|
# Approach 3: Using a Hash
|
|
|
|
#
|
|
|
|
# Time Complexity: O(N), where N is the length of the array
|
|
|
|
#
|
|
|
|
def two_sum(nums, target)
|
|
|
|
hash = {}
|
|
|
|
# create a hash to store values and their indices
|
|
|
|
nums.each_with_index do |num, i|
|
|
|
|
hash[num] = i
|
|
|
|
end
|
|
|
|
# iterate over nums array to find the target (difference between sum target and num)
|
|
|
|
nums.each_with_index do |num, i|
|
|
|
|
difference_target = target - num
|
|
|
|
return [i, hash[difference_target]] if hash[difference_target] && hash[difference_target] != i
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-03-11 17:26:48 +01:00
|
|
|
print two_sum([2, 7, 11, 15], 9)
|
|
|
|
# => [0,1]
|
|
|
|
print two_sum([3, 2, 4], 6)
|
|
|
|
# => [1,2]
|
|
|
|
print two_sum([3, 3], 6)
|
|
|
|
# => [0,1]
|