代码随想录打卡第五天
题目链接/文章讲解/视频讲解: 代码随想录
哈希表,是一种键值对结构,<键,值>是其中的一个元素。在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示:
除了上面说的那几个,数组也是一种给哈希结构,索引和数值构成键值对。
这道题目中的关键点在于,s中字符字母及出现的次数与t中字符字母及出现的次数是否相同。可以使用哈希表解题,统计s每个字母及其出现的次数,构成键值对,<字符字母,该字符字母出现的次数>。除了上面说的三种c++哈希结构,可以直接使用数组,字母a-z只有26个,可以构建一个大小为26的数组,所以0-25分别代表a-z,数值就是字母出现的次数。之后比较两个数组是否相同,或者遍历第二个字符串时对相应字母的数值减一操作,最后判断数组是否为空。
class Solution {
public:bool isAnagram(string s, string t) {int num[26]={0};for(int i=0;i<s.size();i++){num[s[i]-'a']++;}for(int i=0;i<t.size();i++){num[t[i]-'a']--;}for(int i=0;i<26;i++){if(num[i]!=0){return false;}}return true;}
};
自己的解法是创建两个map分别对数组1和数组2进行元素去重,再比较去重后的两个数组是否有交集。代码随想录的解法更简洁,使用set只对一个去重,判断另外的数组是否出现过,出现过则保留在result_set中,没出现过则不保留,最后再转为vector。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {std::map<int,int> nums1_map;//对数组1元素去重std::map<int,int> nums2_map;//对数组2元素去重vector<int> result;for(int i=0;i<nums1.size();i++)//对数组1元素去重{nums1_map.insert({nums1[i],0});}for(int i=0;i<nums2.size();i++){nums2_map.insert({nums2[i],0});//对数组2元素去重}for(auto key:nums1_map){if(nums2_map.find(key.first)!=nums2_map.end())//元素去重后的num1中的元素是否出现在2中{result.push_back(key.first);//出现在2中则是相交的元素}}return result;}
};
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重unordered_set<int> nums_set(nums1.begin(), nums1.end());for (int num : nums2) {// 发现nums2的元素 在nums_set里又出现过if (nums_set.find(num) != nums_set.end()) {result_set.insert(num);}}return vector<int>(result_set.begin(), result_set.end());}
};