## 题目地址 https://leetcode-cn.com/problems/two-sum/ ## 思路 很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。 我们来看一下使用数组和set来做哈希法的局限。 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 * set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为我们要返回x 和 y的下表。所以set 也不能用。 此时我们就要选择一种数据结构 map ,map是一种key value的存储结构,我们可以用key保存数值,用value在保存数值所在的下表。 这道题目是map在哈希法中的经典应用 ## 一般解法 代码: ```C++ ``` ## 优化解法 ```C++ class Solution { public: vector twoSum(vector& nums, int target) { for (int i = 0; i < nums.size(); i ++) { for (int j = i + 1; j < nums.size(); j++) { if (nums[i] + nums[j] == target) { return {i, j}; } } } return {}; } }; ``` ``` class Solution { public: vector twoSum(vector& nums, int target) { std::map map; for(int i = 0; i < nums.size(); i++) { auto iter = map.find(target - nums[i]); if(iter != map.end()) { return {iter->second,i}; } map.insert({nums, i}); } return {}; } }; ``` ``` class Solution { public: vector twoSum(vector& nums, int target) { std::unordered_map map; for(int i = 0; i < nums.size(); i++) { auto iter = map.find(target - nums[i]); if(iter != map.end()) { return {iter->second, i}; break; } map.emplace(nums[i], i); } return {}; } }; ``` > 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。