思路:
输入: 数组,目标值**
输出: 对应元素的数组下标
(1)采用遍历的方法,对每一个数进行匹配。
#include <iostream>
#include<vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
for (vector<int>::iterator it = nums.begin();it != nums.end();it++)
{
for (vector<int>::iterator jt = nums.begin();jt!= nums.end();jt++)
{
if (it != jt)
{
if ((*it) + (*jt) == target)
{
v1.push_back(distance(nums.begin(),it));
v1.push_back(distance(nums.begin(),jt));
return v1;
}
}
}
}
return nums;
}
vector<int>v1;
};
(2)两遍哈希表
因为实际上是要通过数组元素,最后输出下标,所以可以将元素和下标构成哈希表,这样可以直接对一个元素的另一半元素进行查找。可以节省时间。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int>b(2,-1);
map<int, int>a;
for (int i = 0;i < nums.size();i++)
a.insert(map<int, int>::value_type(nums[i], i));
for (int i = 0;i < nums.size();i++)
{
if (a.count(target - nums[i]) > 0&& (a[target - nums[i]] != i))
{
b[0] = i;
b[1] = a[target - nums[i]];
break;
}
}
return b;
}
};
(3)一遍哈希表
两遍哈希表的思路是,先把数组变成哈希表,再在其中查找,需要用到2个循环,如果在插入的时候就进行判断,就可以只用一遍哈希表。而且这样的好处是,一定不会和自己做比较。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int>b(2,-1);
map<int, int>a;
for (int i = 0;i < nums.size();i++)
{
if (a.count(target - nums[i]) > 0)
{
b[0] = a[target - nums[i]];
b[1] = i;
break;
}
a[nums[i]] = i;
}
return b;
}
};
使用哈希表可以大量节省时间,但是所占用的空间明显变多。