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.
假设每个输入只有一个解
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
Brute Force
time complexity O(n2)
space complexity O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public : vector< int > twoSum(vector< int >& nums, int target) { vector< int > result; int len = nums.size(); for ( int i = 0; i < len - 1; ++i){ for ( int j = i + 1; j < len; ++j){ if (nums[i]+nums[j] == target){ result.push_back(i); result.push_back(j); return result; } } } return result; } }; |
Hash
time complexity O(n)
space complexity O(n)
该方法给出的序列是从后往前的
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution { public : vector< int > twoSum(vector< int >& nums, int target) { unordered_map< int , int > imap; for ( int i = 0;; ++i) { auto it = imap.find(target - nums[i]); if (it != imap.end()) return vector< int > {i, it->second}; imap[nums[i]] = i; } } }; |
see discussion here https://discuss.leetcode.com/topic/3294/accepted-c-o-n-solution/2