Two Sum

题目描述:给定一个整数数组,找到其中的两个数之和等于目标值,返回两个数的索引值index1和index2,保证index1<index2,索引值从1开始。

例如:输入为 numbers={2, 7, 11, 15}, target=9,输出为index1=1, index2=2。

最基本的方法是采用两个循环遍历两个数,代码如下:

 1 vector<int> twoSum(vector<int> &numbers, int target) {
 2         vector<int> result;
 3         for(int i=0;i<numbers.size()-1;i++)
 4         {
 5             for(int j=i+1;j<numbers.size();j++)
 6             {
 7                 if(numbers[i]+numbers[j]==target)
 8                 {
 9                     result.push_back(i+1);
10                     result.push_back(j+1);
11                     return result;
12                 }
13             }
14         }
15     }

提交之后果断出现Time Limit Exceeded,为了降低时间复杂度,可以先将数组排序,然后采用两指针的方法:即将头指针与尾指针所指数相加,大于目标数则移动尾指针,小于目标数则移动头指针。因为要返回索引值,我们采用保存pair<int,int>类型的vector容器来存储数组值与对应的索引。代码如下:

 1 vector<int> twoSum(vector<int> &numbers, int target) {
 2         vector<int> result;
 3         vector<pair<int,int> > mid;
 4         mid.reserve(numbers.size());
 5         vector<pair<int,int> >::iterator pos;
 6         vector<pair<int,int> >::iterator end;
 7         for(int i=0;i<numbers.size();i++)
 8         {
 9             mid.push_back(pair<int,int>(i+1,numbers[i]));
10         }     
11         sort(mid.begin(),mid.end(),[&](const pair<int,int> &x, const pair<int,int> &y) -> bool 
12         {  
13            return x.second <y.second;  
14         });
15         for(pos=mid.begin(),end=mid.end()-1;pos!=end;)
16         {
17             if((pos->second+end->second)==target)
18             {
19                return vector<int>(  
20             {min(pos->first, end->first),  
21              max(pos->first, end->first)}); 
22             }
23             else
24             {
25                 if((pos->second+end->second)>target)
26                 {
27                     --end;
28                 }
29                  else
30                  {
31                      ++pos;
32                  }                            
33             }
34         }      
35     }

更简单的方法,采用哈希表的方法,使用哈希表的Key来存数组值,使用Value来存索引,循环遍历数组,查找当前数组值是否在哈希表中,不在则将目标值减该值的差作为Key,循环中的i作为Value存入哈希表中,否则该值在哈希表中对应的Value+1与循环中的i+1即为结果。

以输入为 numbers={2, 7, 11, 15}, target=9为例子进行分析,首先哈希表store中没有值,i=0时,使用store中的find方法,没找到num[0],于是store[9-2]=0;

继续循环,当i=1时,使用store中的find方法查找到num[1],于是该store对应的Value+1与i+1即为所求的索引值。

代码如下:

 1 vector<int> twoSum(vector<int>& nums, int target) {
 2          std::unordered_map<int,int> store;
 3         for(int i = 0; i < nums.size(); ++i)
 4         {
 5             auto itr = store.find(nums[i]);
 6             if(itr != store.end())
 7                 return std::vector<int> {itr->second+1,i+1}; 
 8             else
 9                 store[target-nums[i]] = i;
10         }
11     }

 

posted on 2015-07-06 22:29  dragonzhu  阅读(242)  评论(0编辑  收藏  举报

导航