一直都知道Leetcode这个平台,最近才开始刷题路,后悔也太晚了呀。。
进到Problems的第一个问题就是Two Sum,看了看题目,唔,不难,看了看代码段。。崩溃。。以前从来没有这样写过呀,突然间就要这样还真不太习惯,那么!下面就开始我的摸索之路~
分析:因为数组里面的数有正也有负,而且也不知道最大的数会有多大,所以就只能用map来存,如下:
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> num;
map<int, int> ma;
for(i=0; i<nums.size(); i++){
if(!ma[nums[i]]){
ma[nums[i]]=i+1;//下标加一,那么后面判断这个数出现过没就可以根据下标+1判断了
}
int n=ma[target-nums[i]];
if(n!=0 && (n-1)!=i){
num.push_back(n-1);
num.push_back(i);
return num;
}
}
return num;
}
};//Runtime:16ms, Memory Usage:10.8MB
感觉大概就是这样了...
然后看到了一个更快的版本,见下方:(我根据我的理解,把注释加在代码里了。)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i;
vector<int> results;
map<int, int> hmap;
for(i=0; i<nums.size(); i++){
if(!hmap.count(nums[i])){///如果这个数之前没出现过,那么把这个数存到map里
hmap.insert(pair<int, int>(nums[i], i));
}
if(hmap.count(target-nums[i])){///如果target-nums[i]这个数之前有出现过
int n=hmap[target-nums[i]];///找到那个数的下标
if(n!=i){///下标跟现在这个不相等的话,就输出结果
results.push_back(n);
results.push_back(i);
return results;
}
}
}
return results;
}
};//Runtime:12ms, Memory Usage:10.2MB
后来又发现一个用unordered_map实现的:
原博客:https://blog.csdn.net/matrix6666/article/details/78600164
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> map;
vector<int> result;
int size = nums.size();
for (int i = 0; i < size; i++) {
int numtofind = target - nums[i];
if (map.find(numtofind) != map.end()) {
result.push_back(map[numtofind]);
result.push_back(i);
return result;
}
map[nums[i]] = i;
}
return result;
}
};//Runtime:8ms, Memory Usage:10.1MB
(理解了上面两个代码的话,这个就不用加注释啦~细想其实逻辑差不多)
这个就比前面两个快不少啦,要知道想要在提高运算速度的同时把内存占用也降下来的是非常不容易的。。
这个代码能达到这个速度,应该是因为unordered_map这个结构,比起map,unordered_map不会对元素排序,而map会,所以这又会减少了一定的时间。
还有一个方法是用HashMap实现的,逻辑差不多,这里就不贴代码啦~
Leetcode这个平台给我的感觉和其他OJ不一样,它总给我一种“还可以改改,还可以更快”的感觉,可能是因为它会给我一个解决方案的排名吧。但是优化的方向总是多角度的,思考的维度肯定是在长期积累之后才会拓宽的,果然要学的东西是随着学了的东西的增长而增长的,越学越感觉还有好多要学。
因为这个题折腾了一天,发现自己接触的数据结构类型还是太少,今天就学到了新东西,感觉很不错~