第十三天 2021-3-16每日刷四题
刷题模块:排序 - 简单难度
一、【题】
排序解法
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size()) return false;
sort(s.begin(),s.end());
sort(t.begin(),t.end());
return (s==t);
}
};
官方:哈希表存储s中每一个字符的出现个数,再减去t中的,出现负值则不相同。(由于已经判断size相同,不需要考虑大于零的情况)
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch: s) {
table[ch - 'a']++;
}
for (auto& ch: t) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
注意区分Leetcode算法题和数据结构的区别。利用已有的数据结构和算法解决新的问题。
二、【题】两个数组的交集
哈希表解法,注意答案中不要出现重复元素
作者解法,记录是否已经放入答案中
官方解法,使用两个unordered_set,防止重复元素出现
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
unordered_map<int,int> hash;
int n=nums1.size();
for(int i=0;i<n;i++){
hash[nums1[i]]=1;
}
n=nums2.size();
for(int i=0;i<n;i++){
if(hash.count(nums2[i]) && hash[nums2[i]]==1) {
result.push_back(nums2[i]);
hash[nums2[i]]++;
}
}
return result;
}
};
官方解法:使用排序和双指针
双指针:为了防止重复元素
排序:从头到尾扫描,比较和判断
有点复杂和耗时
三、【题】两个数组的交集 II
哈希表解法,一遍过。
记录了nums1每个元素出现的次数
遍历nums2数组时,若相同且有剩余次数则放入结果数组,并将次数减一。
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
unordered_map<int,int> hash;
for(auto &x:nums1) hash[x]++;
for(auto &x:nums2){
if(hash.count(x) && hash[x]>0){
result.push_back(x);
hash[x]--;
}
}
return result;
}
};