1. 两数之和
题目:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:暴力解法两层循环解决,这里利用map可以使得时间复杂度变小,用目标值减去当前的数组元素,得到需要的值,再去map中寻找,没有就将当前值加入(值作key,下标作value),找到就输出下标和map中对应的值。
注意:
·unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。
·unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。
·unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。
·可以使用[]操作符来访问key值对应的value值。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
int n=target-nums[i];
if(map.find(n)!=map.end()){
return{map[n],i};
}
map[nums[i]]=i;
}
return {};
}
};
49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思路:字母异位词有一个相同的特点,他们组合的字母都一致,这就可以作为一个key,所以可以用排序来确定key。nat和tan的排序都是ant,ant就是key。遍历strs中的所有字符串,对每个字符串进行排序(先转成字符串数组再排序)得到key,再将字符串加入到map[key]中就得到一个整理好的map,最后输出即可。
代码:
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
//初始化map
unordered_map<string,vector<string>> map;
//循环处理每一个字符串,找到对应的key值
for(string& str: strs){
string key=str;
//排序
sort(key.begin(),key.end());
//根据key值放入字符串
map[key].emplace_back(str);
}
//输出整理好的map表
vector<vector<string>> v;
for(auto i=map.begin();i!=map.end();i++){
v.emplace_back(i->second);
}
return v;
}
};