📁1. 兩數之和
? ? ? ? 本題就是將通過兩層遍歷優化而成的,為什么需要兩層遍歷,因為遍歷 i 位置時,不知道i-1之前的元素是多少,如果我們知道了,就可以通過兩數相加和target比較即可。
? ? ? ? 因為本題要求返回下標,所以我們是用unordered_map來存儲<元素值,下標>
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};}
📁49. 字母異位詞分組
????????字母異位詞?是由重新排列源單詞的所有字母得到的一個新單詞。我們就根據這個特性,將字符串重新排序,將重新排序后相同的字符串放到字符串數組中,最終這些字符串數組就是最終結果。
? ? ? ? 這里我們就用到了unordeed_map<string , vector<string>> 來映射重新排序后的字符串對應的字符串數組。
vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string , vector<string>> hash;for(auto str : strs){string s = str;sort(s.begin() , s.end());hash[s].push_back(str);}vector<vector<string>> ret;for(auto kv : hash)ret.push_back(kv.second);return ret;
}
📁128. 最長連續序列
????????找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度,是本題目的關鍵。如果僅僅通過一次遍歷是不能解決問題的,因為遍歷到 i 位置時,得到num[i+1],但是num[i] - 1可能出現在i位置以后,因此我們需要排序或者記錄下來元素是否出現過。
? ? ? ? 題目要求時間復雜度是O(N),因此不考慮排序,這里就用到哈希unordered_set來記錄元素是否出現過。
? ? ? ? 核心思想就是,判斷每個元素是否是最長數字連續序列的第一個元素;如果是,查找之后是否有元素及之后元素的個數。如果不是,就不需要處理了。
int longestConsecutive(vector<int>& nums) {unordered_set<int> hash;for(auto e: nums)hash.insert(e);int ans = 0;for(auto& e : hash){if(!hash.count(e - 1)){int cur = e;int step = 1;while(hash.count(cur + 1)){cur += 1;step += 1;}ans = max(ans , step);}}return ans;}