- 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
解题思路
拉链法哈希表,每个节点存俩参数,数本身和数组中下标
insert函数存
find函数找,并返回下标,若没找到返回-1
需要注意的点是,题目说明不能是同一个元素
比如:
输入:nums = [3,2,4], target = 6
输出:[1,2]
这时候如果先存了3到哈希表里,那么再用find找target-3 = 3,就找到了自己本身,所以需要先找,再把自己存到哈希表里!
我的代码:(用的数组模拟)
class Solution {
public:
int h[100005];
int e[100005][2],ne[100005],idx=0;
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
memset(h,-1,sizeof(h));
memset(e,0,sizeof e);
memset(ne,0,sizeof h);
for(int mm = 0;mm<nums.size();mm++){
int tem = find(target - nums[mm]);
if(tem != -1){
ans.push_back(mm);
ans.push_back(tem);
return ans;
}
insert(nums[mm],mm);
}
return ans;
}
void insert(int x,int p){
int k = (x%100003 + 100003)%100003;
e[idx][0] = x;
e[idx][1] = p;
ne[idx] = h[k];
h[k] = idx++;
}
int find(int x){
int k = (x%100003+100003)%100003;
for(int i = h[k];i!=-1;i = ne[i]){
if(e[i][0] == x) return e[i][1];
}
return -1;
}
};
题解代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。