这是我第一次在Leetcode上写题,说实话,第一次不是太适应
题目链接https://leetcode-cn.com/problems/two-sum/
没想到这么个"简单题"的解法还能这么巧妙
一、暴力
复杂度O(n^2)
用时320ms,内存消耗9.4MB
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; for (int i = 0; i < nums.size(); i++) for (int j = i + 1; j < nums.size(); j++){ if (nums[i] + nums[j] == target){ res.push_back(i); res.push_back(j); return res; } } return res; } };
二、哈希表
复杂度O(n)
用STL里面的map,map.count(key)为在map里面如果存在值为key的,返回true,否则,返回false
用时80ms,内存消耗10.3MB
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; unordered_map<int,int> mymap; for(int i=0;i<nums.size();i++) mymap[nums[i]]=i; for(int i=0;i<nums.size();i++){ int key=target-nums[i]; if(mymap.count(key) && mymap[key]!=i){ res.push_back(i); res.push_back(mymap[key]); break; } } return res; } };
三、哈希表简化操作
其实还可以简化操作,可以写得更简洁一点
一边判断,一遍插入到map中
用时20ms,内存消耗10.2MB
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { map<int, int> m; for (int i = 0; i < nums.size(); ++i) { if (m.count(target - nums[i])) { return {i, m[target - nums[i]]}; } m[nums[i]] = i; } return {}; } };