242. 有效的字母异位词
巧妙运用数组
class Solution {
public:
bool isAnagram(string s, string t) {
if (s.length() != t.length())
return false;
int n = s.length();
int a[26] = {0};
int b[26] = {0};
for (int i=0; i<n; i++){
a[s[i] - 'a'] ++;
b[t[i] - 'a'] ++;
}
for (int i=0; i<26; i++){
if (a[i] != b[i])
return false;
}
return true;
}
};
349. 两个数组的交集
巧妙使用unordered_set容器。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//Step1:将nums1存储到哈希表当中
unordered_set<int> nums(nums1.begin(), nums1.end());
unordered_set<int> ans; //使用set存储结果可以去重
//Step2:遍历nums2,若出现则插入在ans中
for (int num:nums2){
//等价于如下写法:
//for(int i=0; i<nums2.size(); i++)
// int num = nums2[i];
if (nums.find(num) != nums.end())
ans.insert(num);
//如果没找到num,则自动返回nums.end()
//此处!=nums.end(),相当于找到num,属于交集
}
return vector<int>(ans.begin(), ans.end());
}
};
202. 快乐数
一旦需要判断是否出现循环的情况,则可以使用哈希表。
class Solution {
public:
int getsum(int n){
// 求出各位数平方和
int sum = 0;
while(n){
sum += (n%10)*(n%10);
n/=10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> ans; //用来记录平方和是否循环
while(1){
int sum = getsum(n);
if (sum == 1)
return true;
if (ans.find(sum) != ans.end())
return false;
else
ans.insert(sum);
n = sum;
}
}
};
1. 两数之和
巧妙使用unordered_map容器,注意存储时是传入pair<int,int>
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> ans;
for (int i=0; i<nums.size(); i++){
int diff = target-nums[i];
if (ans.find(diff) != ans.end())
return {ans.find(diff)->second, i};
ans.insert(pair<int,int>(nums[i], i));
// 先传入key,在传入value
// 选择谁做key取决于要查找什么
}
return {};
}
};