zoukankan      html  css  js  c++  java
  • 两数之和

    两数之和

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

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

  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15522331.html
Copyright © 2011-2022 走看看