图解LeetCode——1. 两数之和(难度:简单)

一、题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现

你可以按任意顺序返回答案。

二、示例

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9

只会存在一个有效答案

进阶:

你可以想出一个时间复杂度小于 O(n2) 的算法吗?

三、解题思路

3.1> “正向”解题思路

步骤一:如果想要快速确定某个元素是否在nums数组中,并且可以快速的获得所在下标index,我们第一反应应该就是将数组维护成一个Map结构,其中key存储数组里的值value存储的是数组的下标index,但是由于要考虑nums数组终会有相同值的元素,所以value要保存的是数组或者容器结构,如下图所示:

1.png

步骤二:获得了Map结构后,我们就可以开始执行查找操作了。由于题目中已经标明就是两个整数相加等于target值,那我们只需要通过target-nums[i]确定待查找的值,然后去Map中查找即可,如下所示:

1.png

步骤三:在这个例子中,就从Map中匹配到了key=7,value=[1,3]的这种情况。那么由于i=1,所以我们匹配的另一个整数值就是3了,所以返回的匹配结果就是result=[1, 3]

1.png

【总结】

首先,“正向”解题思路跟我们大多数人思考的解题方式是相同的,但是里面存在挺多“麻烦事儿”的,比如Map中的每一个元素的Value都要是数组或者容器类型,这样整体的内存占用空间也会比较大
其次,以上面例子key=7,value=[1,3] ,在这种情况下是可以匹配上的。但是,如果Map存储的是key=7,value=[1],那么当做匹配逻辑的时候,还要验证指针i和value中存储的下标是否相同,如果相同,则不是匹配的

最后,以上面的方式代码实现后,无论是执行时间、内存消耗、代码行数都不好。大家可以参考下面内容:4.1> “正向”解题思路——代码实现

3.2> “逆向”解题思路

为什么叫“逆向”呢?这个词的出发点是Map的用途

在“正向”解题思路中,Map在初始化过程中是先把所有数据都存储,然后作为判断“元素是否存在”的依据

而在“逆向”解题思路中,Map在初始化过程中什么元素都不放,而当待匹配的元素不存在Map中的时候,才把它放入的Map中。具体步骤如下所示:

步骤一:初始化一个空的Map,i指向的值为2,待匹配的值为12,而12并没有在Map中,所以将2放入到Map中。如下所示:

1.png

步骤二:i指向的值为7,待匹配的值为7,而7并没有在Map中,所以将7放入到Map中。如下所示:

1.png

步骤三:i指向的值为11,待匹配的值为3,而3并没有在Map中,所以将11放入到Map中。如下所示:

1.png

步骤四:i指向的值为7,待匹配的值为7,而7存在于Map中,所以匹配成功,返回结果:result=[3, 1]。如下所示:

1.png

【总结】

这种“逆向”解题思路只需要一次循环就可以了,并且Map数组不用提前初始化,在性能和内存占用率都很低。具体代码实现可以参考下面内容:4.2> “逆向”解题思路——代码实现

四、代码实现

4.1> “正向”解题思路——代码实现

这种方式无论是执行时间、内存消耗、代码行数都不好,所以我们依然需要去寻求更优雅的解题方式,如下所示:

1.png

4.2> “逆向”解题思路——代码实现

我们采取了逆向思维的方式,发现可以巧妙的解决这道问题,如下所示:

1.png

今天的文章内容就这些了,最后一句话:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的点赞&分享。

更多技术干活,欢迎大家关注公众号“爪哇缪斯”(o)/~ 「干货分享,每周更新」

题目来源:力扣

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容