242.有效的字母异位词
class Solution {
public:
bool isAnagram(string s, string t) {
unordered_map<char,int> seen;
for(auto c:s){
seen[c]++;
}
for(auto c:t){
if(!seen.count(c))
return false;
seen[c]--;
}
for(auto [k,v]:seen){
if(v!=0)
return false;
}
return true;
}
};
349. 两个数组的交集
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> seen(nums1.begin(),nums1.end());
unordered_set<int> res;
for(auto x:nums2){
if(seen.count(x))
res.insert(x);
}
return vector<int>(res.begin(),res.end());
}
};
set->vector, vector->set,可以利用迭代器直接构造。
202. 快乐数
class Solution {
public:
bool isHappy(int n) {
int sum = 0;
unordered_set<int> seen;
while (true) {
while (n) {
int val = n % 10;
sum += val * val;
n /= 10;
}
if (sum == 1)
return true;
else if (seen.count(sum))
return false;
else{
seen.insert(sum);
n=sum;
sum = 0;
}
}
}
};
1. 两数之和
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> index;
for(int i=0;i<nums.size();i++){
if(index.count(target-nums[i]))
return {i,index[target-nums[i]]};
index[nums[i]]=i;
}
return {};
}
};
若先更新map、再查询,可能导致nums[i]被使用两次。反之,上述代码先查询再更新,index是利用0到i-1的元素构建,所以一定不会查到nums[i],从而不会出现重复选择的问题。