题目链接: https://leetcode-cn.com/problems/two-sum/
解题思路:
1.首先的思考必然是暴力解法,复杂度(N2)
2.使用mp容器,由于必存在,所以我的想法是,先将所有出现的数都存入mp,然后用一个for循环,从nums[0]开始查找与之对应的数字target - nums[0]是否存在,如果存在。则进行一个for循环,从i+1寻找该数
1 vector<int> twoSum(vector<int>& nums, int target) { 2 unordered_map<int, int> mp; 3 for (int i = 0; i < nums.size(); i++) { 4 if (!mp[nums[i]]) mp[nums[i]] = 1; 5 } 6 7 for (int i = 0; i < nums.size(); i++) { 8 int temp = target - nums[i]; 9 if (mp[temp]) { 10 for (int j = i+1; j < nums.size(); j++) { 11 if (nums[j] == temp) 12 return {i, j}; 13 } 14 } 15 } 16 return {}; 17 }
3.提交之后发现时间空间复杂度也不是非常好,然后查看题解,发现了一个超棒的代码,一次for循环,边查找边存储
1 vector<int> twoSum(vector<int>& nums, int target) { 2 unordered_map<int, int> hashtable; 3 for (int i = 0; i < nums.size(); ++i) { 4 auto it = hashtable.find(target - nums[i]); 5 if (it != hashtable.end()) { 6 return {it->second, i}; 7 } 8 hashtable[nums[i]] = i; 9 } 10 return {}; 11 }