首先想到的一定是暴力破解
遍历所有元素找出题解
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
//暴力循环
for (int i = 0; i < nums.size(); ++i) {
//第二个数暴力循环
for (int j = i + 1; j < nums.size(); ++j) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
看完题解之后发现可以用哈希表
编写过程中偶然解锁小tips
思路是空间换取时间
暴力破解时间复杂度太高
所以每次查看之后想办法把判断的结果存起来(增加空间复杂度)
求目标值为两数之和的下标,转化为把遍历过的数保存起来
通过这种方式减低空间复杂度
class Solution2 {
public:
vector<int> twoSum(vector<int> &nums, int target) {
//开辟空间保存
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
//第一个数是需要保存的结果
//所以通过target-first也能得到也就求得second
auto it= hashtable.find(target - nums[i]);
//second在我们保存的first里面出现了
if (it != hashtable.end())
{
return {it->second ,i};
}
hashtable[nums[i]] = i;
}
return {};
}
};
以往都是使用Java和C#,很久没有写C++
hashtable中的迭代器概念
find() 方法如果有则返回下标 否则返回结尾下一个位置迭代器
end() 返回结尾下一个位置迭代器
通过find()和end()的组合可以实现类似Java中的contains()