标签:
题目描述:给定一个整数数组,找到其中的两个数之和等于目标值,返回两个数的索引值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 }
标签:
原文地址:http://www.cnblogs.com/zhulong890816/p/4625603.html