今天开始,就进入哈希表的内容了,哈希表又叫散列表,是一种用空间换取时间的算法,常见的实现哈希表的方法用三种,分别是数组实现,set容器实现,map容器实现(c++)
一般如果数量比较小且数量固定,就用数组实现;
如果数组较大,元素较多就用set;
如果是一对对键值对, 就用map;
242.有效的字母异位词
题目链接如下;242. 有效的字母异位词
因为这道题是涉及26个字母,所以我们用数组来实现哈希表;
class Solution {
public:
bool isAnagram(string s, string t) {
//数组元素全部初始化为零
int hash[26] = {0};
//hash数组存储各个字母格式
for( int i = 0 ;i < s.size(); i++){
hash[s[i]-'a']++;
}
//如果和s字符串字母相同,则--
for(int i = 0;i < t.size(); i++){
hash[t[i] - 'a']--;
}
//如果哈希数组还是全为零,则符合条件,反之则否
for(int i = 0; i <26 ; i++){
if(hash[i] != 0) return false;
}
return true;
}
};
349. 两个数组的交集
题目链接:349. 两个数组的交集
这道题的话,我就用set来做一下,set容器有三种
- set
- multiset
- unordered_set
- 三者区别如下图片@代码随想录
个人代码如下
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//unordered_set自动去除重复元素
unordered_set<int> res;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
//遍历
for( int x : nums2){
if( nums_set.find(x) != nums_set.end()){
res.insert(x);
}
}
//强制转换以符合题目要求
return vector<int> (res.begin(),res.end());
}
};
1. 两数之和
题目链接如下:1. 两数之和
有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
其实第一题对初学算法的人来说还是蛮难的;
首先是我以前用的暴力做法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++)
if(nums[i]+nums[j]==target)
return{i,j};
}
return{};
}
};
这样当然可以做出来,但是时间复杂度太高
这道题我们可以用map,三种map应用区别如下:
卡总代码如下:(阳了,能打卡已经尽力了,全身都是又冷又麻的}
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};