1. 两数之和✅
错过一次没关系,第二次把握住就好
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> mp;
vector<int> res;
for(int i = 0; i < nums.size(); i++) {
int x = target - nums[i];
if(mp.find(x) != mp.end()) {
res.push_back(i);
res.push_back(mp[x]);
return res;
} else {
mp[nums[i]] = i; //key是num,value是下标
}
}
return res;
}
};
49. 字母异位词分组❌
异位词按照字母从小到大排序,可以得到同一个字符串
key用来存什么,value又用来存什么
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> mp;
for(const auto &s : strs) {
string sorted = s;
ranges::sort(sorted);
mp[sorted].push_back(s); //排序后相同的字符串放一起
}
vector<vector<string>> ans;
ans.reserve(mp.size()); //预分配空间 mp.size()取决于mp中key的个数
//那么ans就预分配足够的空间来容纳3个vector<string>对象
for(const auto &[_, value] : mp) { //范围基for循环
ans.push_back(value);
}
return ans;
}
};
128. 最长连续序列✅
简单模拟 掌握好set去重排序
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
set<int> st(nums.begin(), nums.end()); //去重+排序
vector<int> v(st.begin(), st.end());
if(v.size() < 2) return v.size();
int ans = 0;
int len = 1;
for(int i = 1; i < v.size(); i++) {
if(v[i] == v[i-1] + 1) {
len++;
} else {
ans = max(ans, len);
len = 1;
}
}
ans = max(ans, len); //针对最长序列一直延续到末尾的情况
return ans;
}
};
史