回顧一下之前做的哈希,貌似只有用到
unordered_set
:存儲無序元素unordered_map
:存儲無序鍵值對
代碼隨想錄
常用代碼模板2——數據結構 - AcWing
C++知識回顧-CSDN博客
1.兩數之和5/5【30min】
1. 兩數之和 - 力扣(LeetCode)
1.set和map分不清,set是只有值,map是鍵值對。
2、map的鍵值弄反了,找數的話,鍵是數,值是索引i
3.考慮如果有重復的數怎么辦:不要提前把數組轉成map,一邊遍歷一邊轉。
class Solution {//考慮輸入
public:vector<int> twoSum(vector<int>& nums, int target) {//快速判斷一個元素是否出現集合里//如果是哈希,怎么存數據//沒考慮一樣的元素// unordered_set<int> mySet;// for(int i= 0;i<nums.size();i++){// mySet.insert(target - nums[i]);// }// for(int i= 0;i<nums.size();i++){// auto iter = mySet.find(nums[i]);// if(iter!=mySet.end()){// continue;// }// return {i,*iter};// }unordered_map<int,int>findmap;//快速找下標//有重復的怎么辦for(int i = 0;i<nums.size();i++){auto it = findmap.find(target-nums[i]);if(it != findmap.end()){return {i,it->second};}findmap[nums[i]] = i;//索引和值反了}return {};}
};
2?字母異位詞分組【30min】
49. 字母異位詞分組 - 力扣(LeetCode)
map和set的區別,map是鍵值對,set是只有值,vector和set的區別是???
unordered_set/map比set/map用的多的原因是O(1)????
const string&使用引用避免拷貝【如果是不操作這個對象,可以省點空間,否則就創建了新對象】
語法問題:
// ? 錯誤代碼
for (auto it : mp) { ? ? ? ? // it是鍵值對的拷貝,不是迭代器!
? ? result.push_back(it->second); // 錯誤:it不是指針/迭代器
}// ? 修正代碼
for (const auto& entry : mp) { // entry是鍵值對的引用
? ? result.push_back(entry.second); // 正確:用 . 訪問成員
}
?anto it = mp.find("a")這里it是指針
for(auto it : mp)這里it是一個對象,訪問pair的鍵or值需要用點(.)it.second
?問題:1.string的sort函數怎么用:有一個strs:sort(strs.begin(),strs.end())
2.鍵和值怎么考慮,這里其實不需要find
3.一對多的處理:1個sort后的string對應多個string怎么辦:string對應vector<string>【妙】
4.string的初始化,有一個string a,則string b = a;
5.迭代器是指針還是對象,見上
6.想了一下一對多怎么處理,原來想用multiset,find(key)
?返回指向?第一個匹配鍵?的元素的迭代器,可以用equal_range,放后,以后看。
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//tae和tea如何等價//如何處理輸入輸出//按次序排列?//先字符串排序,轉成一樣的用map存。然后find,鍵:原,值:改后的字符串vector<vector<string>>result;// unorder_map<string,string> word;//有重復怎么辦,如果multi_map有重復find返回什么//z這個不用find了,直接遍歷:鍵:改后的字符串;值:原unordered_map<string,vector<string>>mp;for(const auto &it:strs){//這里it是數組// string newOne = sort(it.begin(),it.end());string newOne = it;sort(newOne.begin(),newOne.end());mp[newOne].push_back(it);//*it?}for(const auto &it:mp){result.push_back(it.second);}return result;}};
#include <iostream>
#include <map>int main() {
? ? std::multimap<int, std::string> mmap = {
? ? ? ? {1, "A"}, {1, "B"}, {2, "C"}, {1, "D"}
? ? };? ? // 方法1:使用 find
? ? auto it = mmap.find(1);
? ? if (it != mmap.end()) {
? ? ? ? std::cout << "First match: " << it->second << std::endl; // A
? ? }? ? // 方法2:使用 equal_range
? ? auto range = mmap.equal_range(1);
? ? std::cout << "All values for key 1:\n";
? ? for (auto it = range.first; it != range.second; ++it) {
? ? ? ? std::cout << " ?" << it->second << std::endl; // A, B, D
? ? }? ? // 方法3:使用 lower_bound 和 upper_bound
? ? std::cout << "All values for key 1 (via bounds):\n";
? ? auto lower = mmap.lower_bound(1);
? ? auto upper = mmap.upper_bound(1);
? ? for (auto it = lower; it != upper; ++it) {
? ? ? ? std::cout << " ?" << it->second << std::endl; // A, B, D
? ? }? ? return 0;
}
3.最長連續序列[7min]
128. 最長連續序列 - 力扣(LeetCode)
class Solution {
public:int longestConsecutive(vector<int>& nums) {//字連續的最長序列(不要求序列元素在原數組中連續)的長度。//sort(O(logn))if(nums.size()==0){return 0;}//[]:0sort(nums.begin(),nums.end());int max = 1;//[0]:0int count = 1;for(int i = 0;i<nums.size();i++){if(i == nums.size()-1){break;}if(nums[i] == (nums[i+1]-1)){count++;}else if(nums[i] == nums[i+1]){continue;}else{count = 1;}if(count>=max){max = count;}}return max;//[1,0,1,2]}
};