1、两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> hash;
for(int i=0;i<nums.size();i++)
{
if(hash.find(target-nums[i])!=hash.end())
return {hash[target-nums[i]],i};
hash[nums[i]]=i;
}
return {};
}
};
2、判断是否互为字符重排
给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size()!=s2.size())
return false;
int hash[26];
for(auto& a : s1)
hash[a-'a']++;
for(auto& a : s2)
{
hash[a-'a']--;
if(hash[a-'a']<0)
return false;
}
return true;
}
};
3、 存在重复元素
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
unordered_set<int> hash;
for(auto& a : nums)
{
if(hash.count(a))
return true;
else
hash.insert(a);
}
return false;
}
};
4、存在重复元素 II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); i++) {
if (hash.count(nums[i])) {
if (i - hash[nums[i]] <= k)
return true;
}
hash[nums[i]] = i;
}
return false;
}
};
5、字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
// 1. 把所有的字⺟异位词分组
for (auto& s : strs) {
string tmp = s;
sort(tmp.begin(), tmp.end());
hash[tmp].push_back(s);
}
// 2. 结果提取出来
vector<vector<string>> ret;
for (auto& [x, y] : hash) {
ret.push_back(y);
}
return ret;
}
};