目录
思路:
暴力:双层循环,直接求解
哈希:只遍历一次,如果哈希为空,将遍历的数直接加入到哈希表中,否则,假设遍历的数为cnt,如果(target - cnt)哈希表中,则返回对应的下标; 如果遍历完没有找到两个加起来的数等于target,返回空数组。其中实现方法有用的是unordered_map,map的实现方法和哈希类型
map和unlordered_map的区别:map和unordered_map区别_unorderedmap和map的区别-CSDN博客
暴力求解
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>vec;
for(int i = 0 ; i < nums.size() - 1; i++){
for(int j = i+1; j < nums.size();i++){
if(nums[i] + nums[j] == target){
return{i,j};
}
}
}
return {};
}
};
int main(){
Solution s;
vector<int> vec={1,2,3,4,5};
vector <int> res;
int target = 5;
res = s.twoSum(vec,target);
for( auto i : res){
cout <<i <<endl;
}
return 0;
}
map
#include <iostream>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> map;
for (int i = 0 ; i < nums.size(); i++){
if (map.find(target - nums[i]) != map.end()){
return {map[target - nums[i]],i};
}
else{
map[nums[i]] = i;
}
}
return {};
}
};
int main(){
Solution solution;
vector<int> position;
vector<int> arr = {1,2,3,4,5,6,7,8,9};
int target = 7;
position = solution.twoSum(arr,target);
for(auto i : position)
cout << i << endl;
return 0 ;
}
哈希
// 采用哈希的方式
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>mp;
for(int i = 0; i < nums.size(); i++){
//这里也可以这样if(mp.find(target - nums[i]) != mp.end()){
if(mp.count(target - nums[i])){
return {mp[target-nums[i]],i};
}else{
mp[nums[i]] = i;
}
}
return {};
}
};