题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {2, 7, 11, 15},目标值为9
输出 ndex1=1, index2=2
方法一 暴力遍历(复杂度高O(n^2))
public int[] twoSum (int[] numbers, int target) {
// write code here
int[] index=new int[2];
for(int i=0;i<numbers.length-1;i++){
for(int j=i+1;j<numbers.length;j++){
if(numbers[i]+numbers[j] == target){
index[0]=i+1;
index[1]=j+1;
break;
}
}
}
return index;
}
方法二 使用哈希表,时间复杂度为O(n)(使用c++)
分别扫描两次。1)将数组numbers中的元素保存到哈希表中 ;2)查找哈希表中是否存在元素 target-numbers[i]
class Solution {
public:
/**
*
* @param numbers int整型vector
* @param target int整型
* @return int整型vector
*/
vector<int> twoSum(vector<int>& numbers, int target) {
map<int, int> m;//创建hash表。对应(值,下标)
vector<int> result;//存放查找的两个下标
//1.初始化哈希表
for(int i=0;i<numbers.size();i++){
m[numbers[i]] = i;
}
//2.在hash表中查找target-numbers[i]
for(int i=0;i<numbers.size();i++){
int search = target-numbers[i];
//m.find(search)!=m.end()找到了该值,并且与numbers[i]的下标不相等
if(m.find(search)!=m.end()&& m[search]!=i){
result.push_back(i+1);// 将获取的下标存放到result
result.push_back(m[search]+1);
break;
}
}//for
return result;
}
};