LeetCode 1.Two Sum
leetcode的第一题,two sum:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. |
Custom Testcase :
[3,2,4] |
题解:
仔细观察题意,two numbers, have exactly one solution。
可以了解到:
1.只有两个数字相加,并没有多个数字
2.数组中只有一对数的和正好与target相等,只有一个解。
我刚开始做的时候想的是不管用时怎么样,先ac了再说,所以用的是比较笨的方法就是直接两个循环,判断数组中两个数的和是否与target相等
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; for(int i = 0; i < nums.size(); i++) for(int j = i + 1; j < nums.size(); j++) { if(nums[i] + nums[j] == target) { ret = {i,j}; break; } } return ret; } };
ac之后算法效率果然惨不忍睹:
于是开始提高算法效率
想到以前上算法实验课时,TA有说可以使用STL中的函数就用STL中的函数,因为STL的实现是用binary tree实现的。所以想到了用find函数。但是直接用vector的find函数,返回的是iterator,而不是index,所以使用map,另外一个存储index。代码如下:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; map<int, int> nuins; for(int i = 0; i < nums.size(); i++) { map<int,int>::iterator it = nuins.find(target - nums[i]); if(it != nuins.end()) { ret = {it->second,i}; break; } nuins.insert(pair<int, int>(nums[i],i)); } return ret; } };
其中在刚开始的时候,我犯了一个错误,就是将insert放在了if条件语句前,这样就导致错误,因为有可能target等于某个数的两倍。
而这份代码在ac之后,效率明显上升了:
但是还是没有达到最多人实现的那个效率,所以还将继续改进算法。
在这之后看到了discussion,发现以下代码的效率更高:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret; unordered_multimap<int, int> nuins; for(int i = 0; i < nums.size(); i++) { unordered_multimap<int,int>::iterator it = nuins.find(target - nums[i]); if(it != nuins.end()) { ret = {it->second,i}; break; } nuins.insert(pair<int, int>(nums[i],i)); } return ret; } };
效率图如下:
其中原因是unordered 的map更高效(具体原因还没有去分析),而且使用的还是mutlimap。这都是一些需要注意的细节。
总结:
从这道题可以知道,尽量使用STL中的函数,容器类型也要使用得当,并且对于各个容器的区别要有了解。