给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
通过次数1,201,151提交次数2,452,456
1 // 该方法跑了两次,理论上一次可以完成 2 3 #include <iostream> 4 #include <vector> 5 #include <unordered_map> 6 7 using namespace std; 8 9 class Solution{ 10 public: 11 vector<int> twoSum(vector<int>& nums, int target){ 12 unordered_map<int, int>myhash; 13 vector<int> out; 14 for(int i = 0; i < nums.size(); i++){ 15 myhash[nums[i]] = i; 16 } 17 for(int i = 0; i < nums.size(); i++){ 18 if(myhash[target-nums[i]] && myhash[target-nums[i]] != i){ // 验证 nums[i] 和 target-nums[i]的和是否均在hashmap内部, 并验证的两个加数之一是自身 19 out.push_back(i); 20 out.push_back(myhash[target-nums[i]]); 21 return out; 22 } 23 } 24 return out; 25 } 26 }; 27 28 29 int main() 30 { 31 Solution so; 32 33 vector<int> test; 34 int array[4] = {1,2,4,6}; 35 vector<int> testnum(array, array+4); 36 test = so.twoSum(testnum, 5); 37 for(vector<int>::iterator iter = test.begin(); iter != test.end(); iter++){ 38 cout << *iter << endl; 39 } 40
解法二:一遍hash表
1 class Solution1{ 2 public: 3 vector<int> twoSum(vector<int> &nums, int target){ 4 vector<int> out; 5 unordered_map<int, int> myhash; 6 for(int i = 0 ; i < nums.size(); i++){ 7 int complement = target - nums[i]; 8 if(myhash.find(complement) == myhash.end()){ 9 myhash[nums[i]] = i; 10 }else{ 11 out.push_back(i); 12 out.push_back(myhash.find(complement)->second); 13 return out; 14 } 15 } 16 return out; 17 } 18 };
原文:https://www.cnblogs.com/semie/p/13292206.html