题目:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。注意事项
你可以假设只有一组答案。
样例
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
1.暴力搜索,复杂度为O(n2)
class Solution {
public:
/*
* @param numbers: An array of Integer
* @param target: target = numbers[index1] + numbers[index2]
* @return: [index1 + 1, index2 + 1] (index1 < index2)
*/
vector<int> twoSum(vector<int> &numbers, int target)
{
// write your code here
vector<int> idx(2);//申请一个大小为2的容器存放下标
for(int i=0; i<numbers.size(); i++)
{
for(int j=numbers.size()-1; j>=0; j--)
{
if(numbers[i]+numbers[j]==target && i!=j)
{
idx[1] = i;
idx[0] = j;
}
}
}
if(idx[0]>idx[1])//交换两数
{
idx[0] = idx[0]^idx[1]^idx[0];//方法错误,输出的都是0
idx[1] = idx[0]^idx[1]^idx[1];
}
return idx;
}
};
注意:上述交换两数的方法输出的都是0
2、哈希表,复杂度为O(n)
原理:基本原理:创建一个hashmap,先把所有的值存在hashmap中,其中关键字key是元素的值,value为对应元素的下标。待查找的关键字为target - nums[i],遍历数组直到找到则返回其在数组中的下标。时间复杂度为O(n)。
class Solution {
public:
/*
* @param numbers : An array of Integer
* @param target : target = numbers[index1] + numbers[index2]
* @return : [index1+1, index2+1] (index1 < index2)
*/
vector<int> twoSum(vector<int> &nums, int target) {
// write your code here
int size = nums.size();
int i = 0;
vector<int> result;//这里不能定义长度为2,否则会输出四个数
if(size < 2) //判断是否为空
{
return result;
}
map<int, int> hashMap;//创建一个map,key是元素的值,value是元素原来的下标
for(i=0; i<size; i++)
{
hashMap.insert(pair<int, int>(nums[i], i));//把所有的元素值和下标插入到map
}
for(i=0; i<size; i++)
{
int temp = target - nums[i];
if (hashMap.count(temp)!=0 && hashMap[temp]!=i) //hashMap.count(temp)是temp在表中出现的次数
{
result.push_back(i);
result.push_back(hashMap[temp]);
break;//只要找到就跳出循环
}
}
if(result[0] > result[1]) //调整大小顺序
{
int temp = result[0];
result[0] = result[1];
result[1] = temp;
}
return result;
}
};
参考:1.https://www.cnblogs.com/libaoquan/p/6808064.html
2.http://blog.csdn.net/kkdd2013/article/details/51953035