目录
- 两数之和
- 题目解析
- 方法一暴力求解
- 代码
- 方法二哈希
- 代码
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题
🐯🐯🐯 Git
🚀🚀🚀 leetCode热题100
两数之和
两数之和链接
题目解析
这道题其实就是让我们在给定的数组中找出两个数,让他们相加的和等于给定的值,但是要注意两个数字是不可以相等的,所以如果遇到相等的数字就应该舍去
这道题给出两种解法
第一种是暴力求解,第二种是哈希
方法一暴力求解
暴力解法其实就是给两层循环
先用一个count去记录要相加等于的数字
第一次for循环先让count减去 i 位置的数字
第二层for循环就去找count减去后的值,如果第二层for循环没有找到对应的值,那么就重新让count等于给定的值,然后 i 往后移
之后重复之前的操作
当遇到 i + j 的值为count时要判断他们 i 和 j 是否指向的是同一个位置,如果位置不同但是值相等的我们也要舍去
如果位置不同,且值也不同那么就可以将 i 和 j 的值push_back进一个数组中
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> arr;
int count = target;
for (vector<int>::iterator it1 = nums.begin(); it1 != nums.end(); it1++)
{
count = count - (*it1);
for (vector<int>::iterator it2 = nums.begin(); it2 != nums.end();it2++)
{
if (*it2 == count&&it1!=it2) {
arr.push_back(it1 - nums.begin());
arr.push_back(it2 - nums.begin());
break;
}
}
count = target;
if(arr.size()>0)
break;
}
return arr;
}
};
方法二哈希
下面的代码我也有点看不懂
我来说说我的想法
就是遍历一遍数组,然后将出现的数字存储在一个哈希表中,哈希表是记录数字出现的次数
比如target为10,那么我们在给定的数组中的第一个元素是1,后面我们就在哈希表中查找9这个元素是否存在
可以从上图中看到,哈希表中9存储的是1,说明有一个元素的值是9,因此就查找成功了
代码
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 {};
}
};