一、哈希表理论基础
判断一个元素是否存在在集合中,考虑哈希表
哈希表常见的三种结构:
- 数组
- set
- map
二、有效的字母异位词
题目一:242.有效的字母异位词
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
/*
* @lc app=leetcode.cn id=242 lang=cpp
*
* [242] 有效的字母异位词
*/
// @lc code=start
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> arr(26,0);
for (char c: s) {
arr[c - 'a']++;
}
for (char c: t) {
arr[c - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (arr[i] != 0)
return false;
}
return true;
}
};
// @lc code=end
题目二:383. 赎金信
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次
题目三:49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
题目四:438. 找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
三、两个数组的交集
题目一:349. 两个数组的交集
/*
* @lc app=leetcode.cn id=349 lang=cpp
*
* [349] 两个数组的交集
*/
// @lc code=start
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int x: nums2)
if (nums_set.find(x) != nums_set.end())
result.insert(x);
return vector<int> (result.begin(),result.end());
}
};
// @lc code=end
题目二:350. 两个数组的交集 II
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
四、快乐数
题目一:202. 快乐数
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
/*
* @lc app=leetcode.cn id=202 lang=cpp
*
* [202] 快乐数
*/
// @lc code=start
class Solution {
public:
long long getSum(int n) {
int m, sum = 0;
while(n) {
m = n % 10;
sum += m * m;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> nums;
while (1) {
int sum = getSum(n);
if (sum == 1)
return true;
if (nums.find(sum) != nums.end())
return false;
else
nums.insert(sum);
n = sum;
}
}
};
// @lc code=end
五、两数之和
题目一:1. 两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
/*
* @lc app=leetcode.cn id=1 lang=cpp
*
* [1] 两数之和
*/
// @lc code=start
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> nums_map;
for (int i = 0;i < nums.size(); i++) {
auto it = nums_map.find(target - nums[i]);
if (it != nums_map.end())
return {i, it->second};
nums_map.insert(pair<int,int>(nums[i], i));
}
return {};
}
};
// @lc code=end