twoSum()函数是从题解中cv过来的(感谢no5题解owner:程序员小吴),涉及vector和map的一些使用,很多看不明白。
先调试起来,感受下cpp面向对象编程的魅力。
(还没学会csdn的粘贴代码功能,页面总是崩溃。。)
注:这个题解是有问题的,提交不能通过,后面有提交通过的代码。
关于unordered_map用法:
https://blog.csdn.net/fcku_88/article/details/88353431
hash之类的一脸懵,关注9. 查找操作。
上面的代码漏洞百出,下面一一进行解决。
1.大神的代码怎么理解?
Q:unordered_map record没有初始化,为什么可以直接查找元素?
A:unordered_map 的特点是根据key查找单个value时非常高效,平均可以在常数时间内完成。 但是前提是里面有了多个pair的内容,key-value, key-value, key-value等。。。
如果record.find(complement) 查不到,就返回record.end。所以永远不会return正确的vector。
if后面才执行:record[nums[i]] = i; //含义:如果未找到,则在 record 保存该元素与索引值 I。record第一个元素是 2-0; 即key是2,对应value是0。
这个对record初始化的操作,应该放到查找的前面!! 所以这是题解的笔误or bug?
2.编译问题:
无法用 “int [4]” 类型的值初始化 “std::vector<int, std::allocator> &” 类型的引用(非常量限定)
原因是函数形参是动态数组,不能直接传入一个一般的(静态)数组。
nums定义改为:vector nums[] = { 2, 7, 11, 15 }; //有点不伦不类
报如下错误:
E0415 不存在从 “int” 转换到 “std::vector<int, std::allocator>” 的适当构造函数
去掉[]:vector nums = { 2, 7, 11, 15 };(这样初始化好像也不对,先编过看下结果。。)
vector初始化用push_back函数:
还有其他方法吗?后面再百度一下。。
E3867 “std::vector<int,std::allocator>::begin”: 非标准语法;请使用 “&” 来创建指向成员的指针
该来的总会来,printf那行打印,对泛型函数begin 和end用法不对,要加括号和*来解引用。 (泛型函数:貌似可以作用于很多数据类型的函数,比如vector,list…,有模板库实现的函数。)
printf(“target = %d\t num1 = %d \t num2 = %d\n”,target, *result.begin(), *result.end());
或
printf(“target = %d\t num1 = %d \t num2 = %d\n”,target, *(result.begin()), *(result.end()));
运行时都报如下错误:
Expression:can’t dereference out Of range vector iterator
说明51行printf输出还有问题,不能解引用表示范围的vector iterator(iterator类似指针?暂时这么理解)
使用迭代器访问vector成员:
定义一个iterator,就可以操作vector里面的元素了:
vector::iterator it = result.begin();
printf(“target = %d\t num1 = %d \t num2 = %d\n”, target, *it, *(it+1));
运行输出结果正常:
思考: printf(“target = %d\t num1 = %d \t num2 = %d\n”, target, *it, *(++it)); 输出结果错误,为什么??
如果把vecotr理解为动态数组(好像人家本来就是……),刚开始写成这样更直接:
printf(“target = %d\t num1 = %d \t num2 = %d\n”,target, result[0], result[1]);
提交时有些用例不通过。
比如数组元素是[3,2,4],target=6;预期输出是[1,2]; 但是却输出了[0,0]
调试OK的代码如下:
测试代码:
或许因为用的unordered_map搜索,所以速度比较快。但是内存消耗有点惊呆,why??
如果不用unordered_map ,可以用两层for循环搜索。
速度是使用unordered_map的1/33!!!
总结:for循环嵌套固然思路简单,但是使用c++ map对象编程,速度提高了那么多倍啊!数据结构和算法是个好东西。。。