前言
欢迎来到小K的Leetcode|代码随想录|专题化专栏,今天将为大家带来哈希法~有效的字母异位词 | 两个数组的交集 | 两数之和的分享✨
242. 有效的字母异位词
✨题目链接点这里
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
提示:
1 <= s.length, t.length
<= 5 * 104
s 和 t 仅包含小写字母
思路:
这道题目我们使用哈希法来求解,并且使用数组作为哈希表(字符串为小写字母并且它们的ASCII码值是连续的),所以我们直接定义一个大小为26的数组
如何映射?
就是如何把a-z
映射到0-25,我们直接令当前值减去a就可以了
具体做法
把数组初始化为0,然后遍历字符串1,当该字符出现一次,对应位置的元素加一;同理遍历字符串2,当该字符串出现一次,对应位置的元素减一,如果最后该数组的元素还全部都是0,则说明字符串1和字符串2互为字母异位词,否则返回false
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for (int i = 0; i < s.size(); i++) 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;
}
};
349. 两个数组的交集
✨题目链接点这里
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length
<= 1000
0 <= nums1[i], nums2[i]
<= 1000
【方法一】:使用unordered_set
,把一个数组的值存入其中,再遍历第二个数组,在第一个数组中找第二个数组的值,如果找到,则插入到结果数组中
Tips:
C++ set find——函数用于查找具有给定值 val 的元素。如果找到元素,则返回指向该元素的迭代器,否则返回指向集合末尾的迭代器,即set :: end()。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result;
unordered_set<int> nums(nums1.begin(),nums1.end());
for (int num : nums2) {
if (nums.find(num) != nums.end()) {
result.insert(num);
}
}
return vector<int>(result.begin(),result.end());
}
};
【方法二】:使用数组作为哈希表,因为这里的数组长度在1000以内
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int hashTable[1005] = {0};
unordered_set<int> result;
for (int a : nums1) hashTable[a] = 1;
for (int b : nums2) {
if (hashTable[b] == 1) {
result.insert(b);
}
}
return vector<int>(result.begin(),result.end());
}
};
1. 两数之和
✨题目链接点这里
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length
<= 104
-109 <= nums[i]
<= 109
-109 <= target
<= 109
只会存在一个有效答案
【方法一】:暴力,两层for
循环直接干
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i+1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return {i,j};
}
}
}
return {};
}
};
【方法二】:哈希法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for (int i = 0; i < nums.size(); i++) {
auto iter = map.find(target - nums[i]);
if (iter != map.end()){
return {iter->second,i};
}
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
总结
需要快速判断一个元素是否出现在集合中时,考虑哈希~~