目录
力扣热题100------哈希算法
两数之和
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
cpp
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> m;
for(int i=0;i<nums.size();i++){
auto it = m.find(target-nums[i]);
//find的返回值是{k,v},查找的是k,也就是说k=target-nums[i]
if(it != m.end()){
return{it->second,i};//返回v,这里的含义是index
}
m[nums[i]]=i;//如果没有找到,就把这个数添加进哈希表
}
return{};
}
};
字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""] 输出: [[""]]
示例 3:
输入: strs = ["a"] 输出: [["a"]]
cpp
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
int n=strs.size();
//在这里执行一次静态的计算会比在循环中使用strs.size()节省时间
unordered_map<string,vector<string>>m;
//vector:可动态扩展列表;unordered_map比map节省内存
for(int i =0;i<n;i++){
string str= strs[i];
sort(str.begin(),str.end());
m[str].push_back(strs[i]);
}
vector<vector<string>>res;
for(auto it=m.begin();it!=m.end();it++){//灵活的开始与结束
res.push_back(it->second);
}
return res;
}
};
最长连续序列
给定一个未排序的整数数组
nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为
O(n)
的算法解决此问题。示例 1:
输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9
cpp
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
//find x,x+1,x+2....x+y;len=y-x+1
unordered_set<int> m;
for(auto i : nums) m.insert(i);
int res=0;
for(auto x : m){//C++11访问列表元素方法,并自动赋值
if(!m.count(x-1)){//确认x为起始元素,if x-1 exist, x is not begin
int y = x; // ues y as end figer
while(m.count(y+1)) y++;
res=max(res,y-x+1);
}
}
return res;
}
};