基础知识
哈希表定义
数组就是一张哈希表,能实现随机存储。
哈希表作用
一般哈希表都是用来快速判断一个元素是否出现集合里。(时间复杂度:O(1))
例:我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。通过hashCode把名字转化为数值,一般hashcode是通过特定编码方式,可以将其他数据格式转化为不同的数值,这样就把学生名字映射为哈希表上的索引数字了。
哈希表相关的三种数据结构
- 数组
- set(集合)
- map(映射)
C++标准库中使用的unordered_map底层实现是哈希表
哈希表使用方法:C++中使用哈希表(unordered_map)的一些常用操作方法_C 语言_脚本之家
1. 两数之和
解法一:暴力解法
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<int> twoSum(vector<int>& nums, int target);
int main() {
vector<int>nums = { 2,7,11,15 };
vector<int>p;
vector<int>::iterator it;
int target = 9;
p = twoSum(nums, target);
for (it = p.begin(); it != p.end(); it++) {
cout << *it << ' ';
}
}
vector<int> twoSum(vector<int>& nums, int target) { //暴力解法
/*
算法思想:枚举数组中的每一个数nums[i],再找数组中是否有target-nums[i]
*/
vector<int>ans;
int last;
for (int i = 0; i < nums.size(); i++) {
last = target - nums[i];
for (int j = i + 1; j < nums.size(); j++) {
if (nums[j] == last) {
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
return {};
}
解法二:哈希表
//哈希表的解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int>myhashmap;
int j;
for (int i = 0; i < nums.size(); i++) {
j = target - nums[i];
if (myhashmap.find(j) != myhashmap.end()) {
return { i,myhashmap[j] };
}
myhashmap[nums[i]] = i;
}
return {};
}
};