题目来源
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;
for (int i = 0; i < nums.size(); ++i){
if (hash.count(target - nums[i])){
return {hash[target - nums[i]], i};
}
hash[nums[i]] = i;
}
return {-1, -1};
}
};
题目来源
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ret;
unordered_map<string, vector<string>> hash;
for (auto & s : strs){
string temp = s;
sort(temp.begin(), temp.end());
hash[temp].push_back(s);
}
for (auto & [x, y] : hash){
ret.push_back(y);
}
return ret;
}
};
题目来源
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_map<int, int> hash;
int ret = 0;
for (auto & n : nums){
int prev = hash.count(n - 1) ? hash[n - 1] : 0;
int next = hash.count(n + 1) ? hash[n + 1] : 0;
if (!hash.count(n)){
hash[n] = prev + next + 1;
// 更新边缘数据,边缘数据中间的数据肯定都已经被遍历过了
hash[n - prev] = hash[n];
hash[n + next] = hash[n];
}
ret = max(ret, hash[n]);
}
return ret;
}
};