C++两数之和代码详解
刷题笔记:
两数之和解法有两种,一种为暴力解法,直接for循环嵌套,即可返回所求解;第二种采用的是哈希表,首先来了解下有关哈希表的基本知识及要点。
查找表有两个常用的实现:哈希表+平衡二叉搜索树
哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表:参考链接:哈希表详细讲解
数据结构的物理存储结构只有两种: 顺序存储结构和链式存储结构
在哈希表中新增或者查找某个元素,把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作
存储位置 = f(关键字)
其中,这个函数f一般称为哈希函数,这个函数的设计好坏会直接影响到哈希表的优劣。
哈希冲突
哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。
本文第二种解题方法采用的为unordered_map,在C++中有关unordered_map的哈希表代码用法如下图:
图片引用链接
这张图能帮助我们更好地快速理解程序,并记住关键步骤代码,而除了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++两数之和的代码,本人写该文章纯属把其当做学习笔记来处理,如有技术性问题存在,望各位看官谅解。