242.有效的字母异位词
题目链接:LeetCode242.有效的字母异位词
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
思路:每个字符出现次数相同,说明 s
和 t
长度一样才有可能是字母异位词。通过构建一个存放26个整形元素的数组以表示 a-z
每个字母在字符串中出现的次数。遍历后数组元素均为 0
,则 s
和 t
互为字母异位词。
视频讲解:学透哈希表,数组使用有技巧!Leetcode:242.有效的字母异位词
code:
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length()){
return false;
}
int cnt[26] = {0};
for(int i = 0; i < s.length(); i++){
cnt[s[i] - 'a']++;
cnt[t[i] - 'a']--;
}
for(int i = 0; i < 26; i++){
if(cnt[i] != 0){
return false;
}
}
return true;
}
};
总结:用数组实现哈希表
349. 两个数组的交集
题目链接:LeetCode349. 两个数组的交集
给定两个数组 nums1
和 nums2
,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路:输出结果元素唯一,同时可以不考虑输出结果的顺序,想到 unordered_set
。
参考视频:学透哈希表,set使用有技巧!Leetcode:349. 两个数组的交集
code:
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for(int num : nums2){
if(nums_set.find(num) != nums_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
总结:注意返回值,最后要把 set
转成 vector
。
1. 两数之和
题目链接:LeetCode1. 两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key-value
结构来存放,key
来存元素,value
来存下标,输出可以无序,想到 std::unordered_map
。
code:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int, int> map;
for(int i = 0; i < nums.size(); i++){
auto iter = map.find(target - nums[i]);
if(iter == map.end()){
map.insert(pair<int, int> (nums[i], i));
}else{
return {iter->second, i};
}
}
return {};
}
};
明确两点:
- map用来做什么
- map中key和value分别表示什么
参考文章:
C++ STL unordered_set用法整理
C++ map用法总结(整理)
代码随想录-哈希表-242.有效的字母异位词
代码随想录-哈希表-349. 两个数组的交集
代码随想录-哈希表-1. 两数之和