1、两数之和
cpp
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>mp;
int n=nums.size();
for(int i=0;i<n;i++)
{
auto it=mp.find(target-nums[i]);
if(it!=mp.end())
{
return{i,it->second};
}
else{
mp.insert({nums[i],i});
}
}
return{};
}
};
思路:使用一个哈希表,key为值,value为数组内下标。遍历数组,如果target-当前值存在于哈希表,则证明之前有数和当前值相加等于target返回即可,否则将当前值插入哈希表。
49.字母异位词分组
cpp
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int n=strs.size();
unordered_map<string,vector<string>>mp;
for(int i=0;i<n;i++)
{
string temp=strs[i];
sort(temp.begin(),temp.end());
mp[temp].push_back(strs[i]);
}
vector<vector<string>>ans;
for(auto m:mp){
vector<string>temp;
vector<string>a=m.second;
for(int i=0;i<a.size();i++)
{
temp.push_back(a[i]);
}
ans.push_back(temp);
}
return ans;
}
};
思路:使用一个哈希表,key为排序后的字符串,value为排序前的字符串集合。遍历数组,将每个字符串都插进以它排序后为key的字符串集合。最后返回所有字符串集合构成的一个集合即可。
128.最长连续序列
cpp
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_map<int,bool>mp;
int n=nums.size();
for(int i=0;i<n;i++)
{
mp[nums[i]]=true;
}
int ans=0;
for(auto m:mp)
{
if(mp.find(m.first-1)!=mp.end())
{
continue;
}
else{
int j=1;
while(mp.find(m.first+j)!=mp.end())
{
j++;
}
ans=max(j,ans);
}
}
return ans;
}
};
思路:
(1)用哈希容器存元素,可以在O(1)判断元素是否存在
(2)遍历所有元素,若它是一个连续序列的开头(比它小1的值不存在),就判断这个连续序列长度(依次判断它+1,+2......+n是否存在),并与最大序列长度比较。
错点:
本来for(auto:mp)我这里用的遍历原数组,就有4个样例超时没过,应该是nums有许多重复的元素导致的。