题目
个人解题思路
这个题呢,不考虑别的,就做出来而言还是很简单的,遍历+判断就行。但是吧,这样明显太菜了,不过呢,我又没想到什么好的办法,于是只能往优化遍历的方向走,就是减少不必要的遍历次数。结果,出题者的用例真是太全了,也是我考虑的比较简单,开始只考虑全正,全负,结果还有一正一负的用例出现,我就知道,减少不了遍历次数了,于是老老实实的暴力法提交了。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++)
{
//if((target - nums[i] > -1 && target > 0) || (target - nums[i] < 1 && target < 0) || (target - nums[i] > -1 && target == 0))
for (int j = i+1; j < nums.size(); j++)
if(target == nums[j] + nums[i])
return {i,j};
}
return {};
}
};
优解
在优解中使用了map这种容器,构建了哈希表(都是我没用过的东西)。map容器和python中的字典类似,有键和键值,可通过键寻找键值。将每一次的target-nums[i],都存入哈希表中,在存入之前先用map.find(target-nums[i])寻找是否存在符合要求的值。描述得不是很好,大致就是依次遍历数组,遍历的同时比较已经遍历的数组中是否存在符合要求的结果——target-当前值=已经存在的值时,遍历结束。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable; //创建无序map,普通map是有序的,根据键值从小到大排列
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]); //寻找之前计算结果中是否有符和要求的
if (it != hashtable.end()) { //it 找不到为空,找到了就为整个元素{key,value};
return { it->second, i }; //it->first 表示的是这个元素的key的值;it->second 表示的是这个元素的value的值。
}
hashtable[nums[i]] = i; //这一步比较看不懂,这一步同时把键和键值存入map中
}
return {};
}
};
问题
ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200000380 at pc Oox0000034c733 bp Ox7ff8178defo sp Ox7f1f81
解决办法:注意最后输入的测试用例,一般就能发现问题我是因为没有考虑到[3,2,3] 6这个测试用例而出现的