两数之和

两数之和

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)

有异曲同工之妙

img

存在重复元素题解

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;
    }
};

都是采取,打得过就打,打不过就加入的方法。

posted @ 2021-11-07 23:28  lucky_doog  阅读(54)  评论(0编辑  收藏  举报