做了好多遍的第一题 除了暴力法 为啥总是忘记怎么写呢 呜呜呜
leetcode链接
解题思路
方法一:暴力求解
- 基本思想:两层for循环遍历 i从0开始到nums.size()-1,j从i+1到nums.size()-1,如果nums[i]+nums[j]==target,则返回{i,i};
- 记:return {} 返回一个列表
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(i =0;i<nums.size();i++){
for(j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
return {i,j};
}
}
}
return {};
}
};
方法二:哈希表
- 基本思想:什么时候用哈希法?当需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法
- C++ 知识补充:常见的三种哈希结构有
- 数组
- set(集合)
- map(映射)
- C++ map有三种类型
- map<key,value>举例,find()方法返回值是一个迭代器,成功返回迭代器指向要查找的元素,失败返回的迭代器指向end。maps.find(1)==maps.end()表明没有1这个元素
- count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素,maps.count(1)==0 表明没有1这个元素
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> a;
vector<int> b(2,-1); // 初始化一个值为-1的2维 vector
int i,j,t;
for ( i = 0; i<nums.size(); i++){
t = target - nums[i];
if(a.count(t)) {b[0] = a[t]; b[1] = i; break;}
a[nums[i]] = i; // map添加元素 将a[nums[i]]赋值为下标
}
return b;
}
};
参考链接:
https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA
https://blog.csdn.net/lemn_de/article/details/119325232