思路:
遍历整个数组,将前面的数据放入查找表中,查找当前遍历的元素v和查找表中的元素是否有解,没有解的话,将v也放入查找表,继续遍历
/**
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
*/
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> record;//存储 数字-下标
for(int i=0; i<nums.size(); i++)
{
int tmp = target-nums[i];//在map中寻找是否有目标数字
if(record.find(tmp)!=record.end()) //找到目标数字
{
int res[2]={record[tmp],i};
return vector<int>(res,res+2);
}
record.insert(make_pair(nums[i],i));
}
return vector<int>();
}
};
/**
给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),
使得A[i] + B[j] + C[k] + D[l] = 0。
为了使问题简单化,所有的 A, B, C, D 具有相同的长度N,且 0 ≤ N ≤ 500 --n^2可以
*/
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
int res=0;
//将C+D的结果值存下来 c+d---个数
map<int,int> tmp;
for(int i=0; i<C.size(); i++)
{
for(int j=0; j<D.size(); j++)
{
int sum= C[i]+D[j];
if(tmp.find(sum)==tmp.end())
tmp.insert(make_pair(sum,1));
else
tmp[sum]++;
}
}
//遍历A,B 在map中查找 0-A[i]-B[j]的个数
for(int i=0; i<A.size(); i++)
{
for(int j=0; j<B.size(); j++)
{
int target=0-A[i]-B[j];
if(tmp.find(target)!=tmp.end())
res+=tmp[target];
}
}
return res;
}
};
class Solution {
public:
vector<vector<string> > groupAnagrams(vector<string>& strs) {
map<string,vector<string> > tmpMap;//同构(按照字母序排序)-同构集合
string stmp;
for(int i=0; i<strs.size(); i++)
{
vector<string> vec ;
stmp = strs[i];
sort(strs[i].begin(),strs[i].end()); //按照字母序排序下当前的string
// 去map中找,是否有key相同的
if(tmpMap.find(strs[i])!=tmpMap.end()) // 存在同构
{
vec = tmpMap[strs[i]] ;
vec.push_back(stmp);
tmpMap[strs[i]] = vec;
} else
{
vec.push_back(stmp);
tmpMap.insert(make_pair(strs[i],vec));
}
}
vector<vector<string> > res;
//遍历map将其转换为vector
for(map<string,vector<string> >::iterator iter = tmpMap.begin(); iter!=tmpMap.end(); iter++)
{
res.push_back(iter->second);
}
return res;
}
};
滑动窗口+查找表
滑动窗口思路:
能不能在一个区间[l,l+k]之间找到两个元素相等
对于新的遍历元素,查找在[l+1,l+k]之间有没有与它相同的元素
没有则区间上前滑动
查找过程建立一个查找表:set
/**
给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使
得nums [i] = nums [j],并且 i 和 j的差的绝对值至多为 k。
输入: nums = [1,2,3,1], k = 3
输出: true
*/
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
//滑动窗口+查找表
set<int> setT; //存储滑动窗口的值,set的容量最多为k
for(int i=0; i<nums.size(); i++)
{
//查找当前数在滑动窗口中是否存在
if(setT.find(nums[i])!=setT.end())
return true;
setT.insert(nums[i]);
//set中的元素满了
if(setT.size()==k+1)
{
setT.erase(nums[i-k]);
}
}
return false;
}
};