Leetcode两数之和代码详解

C++两数之和代码详解

刷题笔记:
两数之和解法有两种,一种为暴力解法,直接for循环嵌套,即可返回所求解;第二种采用的是哈希表,首先来了解下有关哈希表的基本知识及要点。

查找表有两个常用的实现:哈希表+平衡二叉搜索树

哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表:参考链接:哈希表详细讲解

数据结构的物理存储结构只有两种: 顺序存储结构和链式存储结构

在哈希表中新增或者查找某个元素,把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作

存储位置 = f(关键字)

其中,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。

哈希冲突

哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。

本文第二种解题方法采用的为unordered_map,在C++中有关unordered_map的哈希表代码用法如下图:
图片引用链接
Leetcode两数之和代码详解
这张图能帮助我们更好地快速理解程序,并记住关键步骤代码,而除了unordered_map还有map和hash_map,关于三者可参考:map,hash_map和unordered_map 实现比较

接下来就是具体实现的代码(该代码具有参考意义并非一定为最优解)

//暴力解法
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class solution
{
public:
    vector<int> twosum(vector<int> &nums, int target)
    {
        int n = nums.size();
        for (int i = 0; i < n - 1; ++i)
        {
            for (int j = i + 1; j < n; ++j)
            {
                if (nums[i] + nums[j] == target)
                {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

//无序哈希表法 unordered_map
class Hash
{
public:
    vector<int> twosum(vector<int> &nums, int target) //定义返回格式
    {
        //创建哈希表 unordered_map<key, value> map_name;
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i)
        {
            auto it = hashtable.find(target - nums[i]); //table_name.find(key);
            if(it != hashtable.end()) //如果没有找到则返回end();
            {
                //用迭代器访问元素的键值 it -> first;  it -> second指向value;
                return{it -> second , i}; 
            }
            hashtable[nums[i]] = i; //插入元素,三种方法。 a[key]=value;
        }  
        return{};     
    }
};

int main()
{
    solution s; //定义类的一个对象s;
    Hash h;
    vector<int> position;
    vector<int> arr = {2, 7, 11, 15};
    int target = 9;
    //position = s.twosum(arr, target);
    position = h.twosum(arr, target);
    for (auto i : position)  //遍历position
        cout << i << " ";
    cout << endl;
    return 0;
}

以上便是完整版的C++两数之和的代码,本人写该文章纯属把其当做学习笔记来处理,如有技术性问题存在,望各位看官谅解。

上一篇:C++ 学习笔记9-unordered_multiset、set和unordered_map、multimap 六


下一篇:FinTech中国量化金融行业白皮书(2019)