[萌新c++] LeetCode 1两数之和

在这里插入图片描述

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对象编程,速度提高了那么多倍啊!数据结构和算法是个好东西。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值