给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路1:使用map数据结构
class Solution2601 {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//[3,4,6] target = 7
//定义一个无序的map:
unordered_map<int, int> m1;
//遍历这个数组
for (int i = 0; i < nums.size(); i++) {
//利用目标值减去数组的元素等于num
// 4 = 7-3
int num = target - nums[i];
//寻找map中是否有4
unordered_map<int, int>::iterator pos = m1.find(num);
if (pos == m1.end()) {//map中没有num,则插入map中;
m1.insert(pair<int, int>(nums[i], i));
}
else {
//v1.push_back(i);
//v1.push_back(pos->second);
return { i,pos->second };
}
}
//return v1;
return{};
}
};
思路2:暴力解法
class Solution260 {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_set <int> s1;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.size(); j++) {
//利用暴力解法:
//两层for循环,将元素相加,判断是否等于target,并且i != j
if (nums[i] + nums[j] == target && i != j) {
s1.insert(i);
s1.insert(j);
}
}
}
return vector<int>(s1.begin(), s1.end());
}
};