TheAlgorithms-Ruby/data_structures/hash_table/two_sum.rb
2021-03-29 15:35:18 -07:00

70 lines
1.7 KiB
Ruby

# 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[]}
#
# Approach: Using Hash table
#
# Complexity analysis
# Time complexity: O(n). We traverse the list containing n elements exactly twice.
# Since the hash table reduces the lookup time to O(1), the time complexity is O(n).
# Space complexity: O(n). The extra space required depends on the number of items
# stored in the hash table, which stores exactly n elements.
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
if hash[difference_target] && hash[difference_target] != i
return [i, hash[difference_target]]
end
end
end
nums = [2, 7, 11, 15]
target = 9
print(two_sum(nums, target))
# => [0,1]
nums = [3, 2, 4]
target = 6
print(two_sum(nums, target))
# => [1,2]
nums = [3, 3]
target = 6
print(two_sum(nums, target))
# => [0,1]