算法记录Day 6 | 哈希表part01
LeetCode 242-有效的字母异位词
题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意: 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
输入: s = "anagram", t = "nagaram"
输出: true
题解
class Solution {
public:
bool isAnagram(string s, string t) {
unordered_map<char, int> countMap;
for (char c : s) {
countMap[c] += 1;
}
for (char c : t) {
countMap[c] -= 1;
}
for (auto &t : countMap) {
if (t.second != 0) {
return false;
}
}
return true;
}
};
解题思路
使用hsahmap做计数器,最后遍历计数器的值是不是为0.
LeetCode 349-两个数组的交集
题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
题解
class Solution {
public:
vector<int> intersection(vector<int> &nums1, vector<int> &nums2) {
set<int> numSet;
set<int> resSet;
vector<int> res;
for (auto n : nums1) {
numSet.insert(n);
}
for (auto n : nums2) {
if (numSet.count(n) != 0) {
resSet.insert(n);
}
}
for (auto &e : resSet) {
res.push_back(e);
}
return res;
}
};
解题思路
两个集合计算交集。
LeetCode 202-快乐数
题目描述:编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
输入: n = 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
题解
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> sumSet;
size_t maxN = pow(2, 31) - 1;
while (true) {
int sum = getSum(n);
if (sum == 1) {
return true;
}
if (sum > maxN) {
return false;
}
if (sumSet.find(sum) != sumSet.end()) {
return false;
} else {
sumSet.insert(sum);
}
n = sum;
}
}
int getSum(int n) {
/*先求模获得最右边的数字,然后/10,移除最低位*/
int sum = 0;
while (n != 0) {
sum += (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
};
解题思路
第一次做的时候在遍历n,看了题解后知道可以通过先取模获得数字的最低位,然后除以10消除最小的一位数。从而从低位到高位遍历数字。同时用一个set记录所有出现过的sum,如果重复说明陷入了循环。
LeetCode 1-两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
题解
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> map;
vector<int> res;
for (int i = 0; i < nums.size(); i++) {
auto iter = map.find(target - nums[i]);
if (iter != map.end()) {
res.push_back(iter->second);
res.push_back(i);
return res;
} else {
map.insert(pair<int, int>(nums[i], i));
}
}
return res;
}
};
解题思路
c++的hashmap使用跟go的差异比较大,需要使用unordered_map.find()返回一个迭代器iter, 它有两个属性:first返回key,second返回value。insert()方法需要插入一个pair<int,int>类型的数据结构。
if (got == mymap.end()) {// 元素不存在}