DAY5 哈希表part01
今日任务
● 哈希表理论基础
● 242.有效的字母异位词
● 349. 两个数组的交集
● 202. 快乐数
● 1. 两数之和
哈希表理论基础
1、哈希表用于快速判断一个元素是否出现在集合当中
2、哈希函数和哈希碰撞(拉链法和线性探测法)
3、哈希结构(数组集合和映射)以及他们的用法
4、哈希表是一种牺牲空间换时间的数据结构
242.有效的字母异位词
1 class Solution { 2 public: 3 bool isAnagram(string s, string t) { 4 int lens=s.size(); 5 int lent=t.size(); 6 int record[26]={0}; 7 if(lens!=lent) return false; 8 for(int i=0;i<lens;i++) 9 { 10 record[s[i]-'a']++; 11 } 12 13 for(int i=0;i<lent;i++) 14 { 15 record[t[i]-'a']--; 16 } 17 18 for(int i=0;i<26;i++) 19 if(record[i]!=0) return false; 20 21 return true; 22 } 23 };
两个数组的交集
1 class Solution { 2 public: 3 vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { 4 unordered_set<int> result; 5 unordered_set<int> nums(nums1.begin(),nums1.end());//使用unordered——set 6 7 for(int num:nums2) 8 { 9 if(nums.find(num)!=nums.end()) 10 result.insert(num); 11 } 12 return vector<int>(result.begin(),result.end()); 13 } 14 };
● 快乐数
注意求和函数的书写
1 class Solution { 2 public: 3 bool isHappy(int n) { 4 int sum=getsum(n); 5 unordered_set<int> sums; 6 while(sum!=1) 7 { 8 sums.insert(sum); 9 sum=getsum(sum); 10 11 if(sums.find(sum)!=sums.end()) return false; 12 } 13 return true; 14 15 } 16 int getsum(int n) 17 { 18 int sum=0; 19 while(n) 20 { 21 sum+=(n%10)*(n%10); 22 n/=10; 23 } 24 return sum; 25 } 26 };
1. 两数之和
题目链接/文章讲解/视频讲解:https://programmercarl.com/0001.%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8C.html
本题使用map,熟悉具体操作如find,insert(pair<int,int>(iter1,iter2)) , iter->first/second
思路比较难想,由于不能使用重复的元素,实际上map存遍历过的,防止出现重复使用的情况
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 std::unordered_map <int,int> map; 5 for(int i=0;i<nums.size();i++) 6 {auto iter=map.find(target-nums[i]); 7 if(iter!=map.end()) 8 return {iter->second,i}; 9 else map.insert(pair<int,int>(nums[i],i)); 10 } 11 return {}; 12 } 13 };