1. 两数之和
以前做过的hash。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_set<int> set;
map<int,int> map;
for(int i = 0; i < nums.size();i++)
{
set.insert(nums[i]);
map[nums[i]] = i;
}
vector<int> output;
for(int i = 0;i < nums.size();i++)
{
if(set.find(target - nums[i]) != set.end()) //找到了
{ // 如果是 map[3] = 1 map[3] = 2 估计find的时候会先找到
if(map[target - nums[i]] == i)continue; //不能自己和自己加
output.push_back(i);
output.push_back(map[(target-nums[i])]);
break;
}
}
return output;
}
};
49. 字母异位词分组
用multimap的哈希思想。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ans;
bool vis[strs.size()+2];
memset(vis, 0, sizeof(vis));// 可以初始化一个全为true的数组
multiset<int> a[strs.size()+2]; //重点用一下multiset,不去重,且有序!
//预处理
for(int i = 0; i < strs.size();i++)
for(int j = 0; j < strs[i].size();j++)
a[i].insert(strs[i][j] - 'a');
//找结果
for(int i = 0; i < strs.size();i++)
{
if(!vis[i])
{
vector<string> unit;
vis[i] = 1;
unit.push_back(strs[i]);
for(int j = i+1;j < strs.size();j++)
{
if(a[i] == a[j])
{
vis[j] = 1;
unit.push_back(strs[j]);
}
}
ans.push_back(unit);
}
}
return ans;
}
};
128. 最长连续序列
考虑[0,1,2,0]的答案为3,即需要去重==.》用set。
sort 复杂度=====》(O(nlogn)),+遍历 不符合题目要求,但也过了。
class Solution {
public:
int longestConsecutive(vector<int>& nums)
{
// 去重且sort一遍(logn)+遍历一遍
set<int> set1;
for(int i =0; i < nums.size() ;i++)
set1.insert(nums[i]);
vector<int> tmp;
for(int x : set1)
tmp.push_back(x);
sort(tmp.begin(),tmp.end());
int tp = 0;
int max_tp = 0;
for(int i =0; i < tmp.size() ;i++)
{
if(i == 0)tp++;
if(i > 0 && tmp[i-1]+ 1 == tmp[i] )tp++;
else if(i > 0 && tmp[i-1]+ 1 != tmp[i] )
{
tp = 1;
}
if(tp > max_tp)max_tp = tp;
}
return max_tp;
}
};