Problem:
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].
Idea:
Brute force / Hashtable
Solution1:
Brute force / C++
Time complexity: O(n^2)
Space complexity: O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Author: Huahua // Runtime: 166 ms class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { for (int i = 0; i < nums.size(); ++i) { for (int j = i + 1;j < nums.size(); ++j) { int sum = nums[i] + nums[j]; if (sum == target) { return {i, j}; } } } return {}; } }; |
Solution 2:
Hashtable / C++
Time complexity: O(n)
Space complexity: O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Author: Huahua // Runtime: 6 ms class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> indies; for (int i = 0; i < nums.size(); ++i) indies[nums[i]] = i; for (int i = 0; i < nums.size(); ++i) { int left = target - nums[i]; if (indies.count(left) && indies[left] != i) { return {i, indies[left]}; } } return {}; } }; |