001-twosum

给定一个整数数组 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 };

 

posted @ 2020-07-13 11:12  semieZX  阅读(145)  评论(0编辑  收藏  举报