给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:把问题转化为,给定一个i,在nums中查找是否存在一个j,使得nums[j] = target - nums[i],且j不等于i。
因此程序框架如下
for: nums中的i
在nums中查找 nums[j] = target - nums[i]
如果找到了:
return i,j
因此查找成了关键的一步,这里采用哈希表进行查找,代码如下
#include <vector>
#include<iostream>
using namespace std;
class Solution {
public:
class hashNode //利用链表解决哈希表冲突
{
public:
int num; //数字
int index; //在原先nums中的index
hashNode* next; //当出现冲突时,冲突元素形成链表
hashNode() //构造函数
{
num = -1;
index = -1;
next = NULL;
}
};
#define hash_size 1000
static inline vector<hashNode*> makeHash(const vector<int> &nums)
{
vector<hashNode*> hashlist(hash_size);
for (int i = 0; i < nums.size(); i++)
{
int hash_index = abs(nums[i]) % hash_size;
hashNode* new_Node = new hashNode;
new_Node->index = i;
new_Node->num = nums[i];
new_Node->next = hashlist[hash_index];
hashlist[hash_index] = new_Node;
}
return hashlist;
}
static inline int find_element(const vector<hashNode*>& hash_list, int target)
{
int hash_index = abs(target) % hash_size;
hashNode* p = hash_list[hash_index];
while (p)
{
if (p->num == target)
return p->index;
else {
p = p->next;
}
}
return -1;
}
static vector<int> twoSum(vector<int>& nums, int target) {
vector<hashNode*> hash_list = makeHash(nums);
for (int i = 0; i < nums.size();i++)
{
int index = find_element(hash_list, target - nums[i]);
if (index != -1 && index != i)
{
vector<int> res;
res.push_back(i);
res.push_back(index);
return res;
}
}
vector<int> res;
return res;
}
};