• 两数之和


    两数之和

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

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

  • 相关阅读:
    Maven命令行使用:mvn clean package(打包)
    快速构建 Spring Boot 应用
    Spring MVC 表单处理
    Spring Web Hello World 例子
    Spring 事务管理
    开发环境搭建
    考研计算机专业课练习题
    考研计算机自测练习
    考研计算机自测练习答案
    考研计算机专业常见术语
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15522331.html
Copyright © 2020-2023  润新知