两数之和
1. 两数之和 - 力扣(LeetCode) (leetcode-cn.com)
相关C++数据结构
unordered_map
C++ STL unordered_map容器用法详解 (biancheng.net)
insert() | 向容器中添加新键值对。 |
---|---|
find(key) | 查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。 |
pair
C++ STL关联式容器详解 (biancheng.net)
pair1.first = "Java教程";
pair1.second = "http://c.biancheng.net/java/";
cout << "new pair1: " << pair1.first << " " << pair1.second << endl;
find
auto iter = myMap.find("Java教程");
//从 iter 开始,遍历 map 容器
for (; iter != myMap.end(); ++iter) {
cout << iter->first << " " << iter->second << endl;
}
vector
C++ STL vector容器详解 (biancheng.net)
insert() | 在指定的位置插入一个或多个元素。 |
---|---|
push_back() | 在序列的尾部添加一个元素。 |
迭代器
迭代器是什么,C++ STL迭代器(iterator)用法详解 (biancheng.net)
multimap
C++ multimap(STL multimap)的使用详解 (biancheng.net)
如果使用 multimap 容器,几乎可以肯定它会包含键重复的元素;否则,就应该使用 map。一般来说,我们想访问给定键对应的所有元素。成员函数 equal_range() 就可以做到这一点。它会返回一个封装了两个迭代器的 pair 对象,这两个迭代器所确定范围内的元素的键和参数值相等。例如:
auto pr = people.equal_range("Ann");
if(pr.first != std::end(people)){
for (auto iter = pr.first ; iter != pr.second; ++iter)
std:cout << iter->first << " is " << iter->second << std::endl;
}
equal_range() 的参数可以是和键同类型的对象,或是不同类型的但可以和键比较的对象。返回的 pair 对象的成员变量 first 是一个迭代器,它指向第一个大于等于参数的元素;如果键和参数相等的元素存在的话,它是第一个键和参数相同的元素。如果键不存在,pair 的成员变量 first 就是容器的结束迭代器,所以应该总是对它们进行捡查。
pair 的成员变量 second 也是一个迭代器,它指向键值大于参数的第一个参数;如果没有这样的元素,它会是一个结束迭代器。这段代码会输出容器中键值为”Ann”的元素的一些信息。
我的解法
第一次尝试-采用unordered_map
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> umap;
vector<int> result;
for (int i = 0; i < nums.size(); i++)
{
pair<int, int> p(nums.at(i), i);
umap.insert(p);
}
for (auto i = umap.begin(); i != umap.end(); i++)
{
int compliment = target - i->first;
auto j = umap.find(compliment);
if (j != umap.end())
{
result.push_back(i->second);
result.push_back(j->second);
return result;
}
}
return result;
}
};
无法通过测试用例
[3,3] 6
因为不含重复元素
第二次尝试-使用multimap
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
multimap<int, int> mmap;
vector<int> result;
for (int i = 0; i < nums.size(); i++)
{
pair<int, int> p(nums.at(i), i);
mmap.insert(p);
}
for (auto i = mmap.begin(); i != mmap.end(); i++)
{
int compliment = target - i->first;
auto p = mmap.equal_range(compliment);
for (auto j = p.first; i!=j && j != p.second; j++)
{
result.push_back(i->second);
result.push_back(j->second);
return result;
}
}
return result;
}
};
官方题解-采用unordered_map
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> umap;
for (int i = 0; i < nums.size(); i++)
{
auto j = umap.find(target - nums[i]);
if (j != umap.end())
return {i, j->second};
umap.insert(pair(nums[i], i));
}
return {};
}
};
跟217. 存在重复元素 - 力扣(LeetCode) (leetcode-cn.com)
有异曲同工之妙
存在重复元素题解
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> uset;
for (int i = 0; i < nums.size(); i++)
{
if (uset.find(nums[i])!=uset.end())
return true;
uset.insert(nums[i]);
}
return false;
}
};
都是采取,打得过就打,打不过就加入的方法。