由于Python效率太低,会出现超时问题,所以从头学习C++来写.
题目如下:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1.暴力解法非常简单,遍历两次数组即可.
2.用哈希表来实现:
- 一边建表一边查找;
- 先建表后查找.
代码分别如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> myMap;
vector<int> result;
for (int i = 0; i < nums.size(); i++) {
if (myMap.find(target - nums[i]) == myMap.end()) {
myMap[nums[i]] = i;
} else {
result = {myMap[target - nums[i]], i}; //如果target-num存在,则该索引一定在前.
break;
}
}
return result;
}
};
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
//利用map来构建哈希表
map<int, int> Hash;
vector<int> res;
for(int i=0; i<numbers.size(); i++)//Hash的键值为numbers的元素值,实值为i
{
Hash[numbers[i]] = i;
}
for(int i=0; i<numbers.size(); i++)
{
const int diff = target - numbers[i];//定义差值为目标值减去当前numbers元素值
if(Hash.find(diff) != Hash.end() && Hash[diff] > i) //如果当前diff在Hash表中,并且实值大于当前i,将i+1和Hash[diff]+1压入vector<int> res
{
res.push_back(i + 1);
res.push_back(Hash[diff] + 1);
break;
}
}
return res;
}
};
存在问题:
- vector<int> twoSum(vector<int>& nums, int target), 该构建函数的用法并不太懂;
- 由于数据结构没学过,哈希表的掌握还不够深入.
- 哈希表查找如果该值不存在,则自动指向map尾部.
参考:
https://www.cnblogs.com/codernie/p/9180361.html
https://www.nowcoder.com/questionTerminal/20ef0972485e41019e39543e8e895b7f