题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2
示例1
输入
[3,2,4],6
返回值
[2,3]
思路一:暴力破解
两层遍历,判断第二层遍历的值与target和第一层遍历之差是否相等,时间复杂度O(n^2),空间复杂度O(1)
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> res {0,0};// 返回数组的两个下标
for(int i=0; i<numbers.size(); i++){//第一层遍历
for(int j=i+1; j<numbers.size(); j++){
if( numbers[j] == (target-numbers[i]) ){//判断第二层遍历值是否为差值;两层遍历的数的下标不会相等
res[0] = i+1;
res[1] = j+1;
return res;
}
}
}
throw "No two sum solution";
}
};
思路二:哈希表
创建哈希表,空间换时间
时间复杂度O(n),空间复杂度O(n)
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
// write code here
vector<int> res{0,0};//返回的索引
map<int,int> mp;//创建哈希表
for(int i=0;i<numbers.size();i++){
mp[numbers[i]]=i;
}//数组元素值与下标对应的哈希表
for(int i=0;i<numbers.size();i++){
int com=target-numbers[i];
if(mp.count(com)!=0&&mp.at(com)!=i){//判断哈希表中是否有com的值,以及该值下标与i不等
res={i+1,mp.at(com)+1};
return res;
}
}
throw "No two sum solution";
}
};