242. 有效的字母异位词
算法思路:采用哈希表的数组方法,先定义一个record用来记录s中字母出现的次数,把字符映射到哈希表的索引下表,例如将a映射到0,z映射到25,再遍历s,只需要将s[i] - 'a’做+1操作即可。检查t中的字符映射到哈希表中做-1操作。最后看record中是否为0,为0就是有效的字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0}; // 记录每个字母出现的次数
for (int i = 0; i < s.size(); i++) { // 遍历s找到s中字母出现的次数
record[s[i] - 'a']++;
}
for (int j = 0; j < t.size(); j++) {
record[t[j] - 'a']--;
}
for (int k = 0; k < 26; k++) {
if (record[k] != 0)
return false;
}
return true;
}
};
时间复杂度:O(n)
思路: 本题采用哈希表的set数据结构,set有三种数据结构,
std::set
std::multiset
std::unordered_set
multiset是可重复的,而unordered_set是去重的
首先定义一个unordered_set类型的result存放结果,可去重,将nums索引到哈希表中,遍历nums2,找到与哈希表中元素相同的插入到哈希表中。最后将结果转为数组
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // unordered_set给结果resutlt去重
unordered_set<int> nums_set(nums1.begin(), nums1.end()); // 将nums1中的元素索引到哈希表
for (int i = 0; i < nums2.size(); i++) {
if (nums_set.find(nums2[i]) != nums_set.end())
result_set.insert(nums2[i]);
}
return vector<int>(result_set.begin(), result_set.end());
}
};
// O(logn)
// 思路: 当快速查找一个元素是否在集合里时,使用哈希表法。 判断sum是否重复则采用unordered_set。求和过程需要取各位上的值
class Solution {
public:
int getSum (int n) {
int sum = 0;
while (n != 0) { // 取各个位上的单数
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while (1) { // 无限循环语句,意思是无论条件如何,循环会一直执行下去。条件部分为1,而1代表真(非零),所以这个循环将一直执行
int sum = getSum(n);
if (sum == 1) { // 若sum=1 说明n是快乐数
return true;
}
if (set.find(sum) != set.end()) { // 若sum曾经出现过,则说明死循环了
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
// O(n)
// 思路: 当需要查询一个元素是否在集合里就用哈希法。本题需要用一个集合来存放遍历过的元素,然后遍历数组去查找询问这个集合,找到后返回值和下标
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> map; // 定义一个unordered_map容器用于存放访问过的元素
for (int i = 0; i < nums.size(); i++) { // 遍历数组
auto iter = map.find(target - nums[i]); // 再哈希表中寻找匹配项key值
if (iter != map.end()) {
return {iter->second, i}; // 返回值和下标
}
map.insert(pair<int,int>(nums[i], i)); // 如果没有找到合适的匹配项,就把访问过的元素加入到map容器中
}
return {};
}
};