// Given an array of integers, return indices of the two numbers such that they add up to a specific target.

// You may assume that each input would have exactly one solution, and you may not use the same element twice.

// Example:

// Given nums = [2, 7, 11, 15], target = 9,

// Because nums[0] + nums[1] = 2 + 7 = 9,
// return [0, 1].

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
//Time - O(n^2), space - O(1)
var twoSumBruteForce = function (nums, target) {
	for (let i = 0; i < nums.length; i++) {
		for (let j = i + 1; j < nums.length; j++) {
			if (nums[i] + nums[j] === target) return [i, j]
		}
	}
}

//Time - O(n), space - O(n)
var twoSum = (nums, target) => {
	const objMap = {}
	for (let i = 0; i < nums.length; i++) {
		const complement = target - nums[i]
		if (objMap.hasOwnProperty(complement)) {
			return [objMap[complement], i]
		}
		objMap[nums[i]] = i
	}
}

// Tests
console.log(twoSumBruteForce([1, 3, 4, 5, 6, 7], 4))
console.log(twoSum([1, 3, 4, 5, 6, 7], 4))