博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
返回指针_图解两数之和:双指针法
阅读量:4357 次
发布时间:2019-06-07

本文共 1420 字,大约阅读时间需要 4 分钟。

点击上方“JS漫步指南”关注,优质文章第一时间送达!


两数之和是一道非常经典,也非常高频的面试题,题目大意如下:

给定一个整数数组
nums 和一个目标值
target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
case:
给定 
nums = [2, 1, 7, 11, 15], target = 9
因为 
nums[0] + nums[2] = 2 + 7 = 9
所以返回 
[0, 2]

之前我们探讨了这个问题的暴力运算法和哈希表法,今天我们使用双指针法来解决它。

太长不看版

  • 首先排序数组;

  • 使用leftright两个指针;

  • 比较targetleft值加right值的和,移动对应的指针;

  • 双指针解法的时间复杂度取决于对应的排序算法,空间复杂度为O(n)。

什么是双指针?

双指针和快速排序、冒泡排序等具体算法不同。它更接近于一种思(tào)路,一种使用两个指针互相配合来存储节点以便于运算的技巧。

双指针法适用于数组、链表等线性数据结构,常用的思路有:碰撞指针、滑动窗口、快慢指针等。

在两数之和这个case中我们使用碰撞指针的方式来实现,其它两种套路会在后续文章中介绍。

0.排序

所谓碰撞指针,是指在有序数组中定义left(数组起始位置)、right(数组终止位置)两个指针,在遍历时根据对应条件的不同来判断应该移动哪个指针,进而从数组两端遍历数组。

所以在两数之和中我们需要先将目标数组进行排序:


14f1336d845fc49d49f7bd67d2e4c134.png


排序算法的时间复杂度决定了整个计算的时间复杂度。因为双指针遍历的复杂度是O(n)。

1.创建双指针

在排好序的数组(以下简称数组)两端分别创建leftright指针:


0197187c01285ab87861528e7480190d.png


2.左移右指针

此时left值与right值之和(以下简称sum)大于target,此时应该将right左移一位,减小sum使其更接近target

从这里就可以看出,为什么对有序数组才适用碰撞指针。


bb5e5cd8ce0a125581c8d06bb3aa11d1.png


3.继续遍历数组

在这个case中我们需要继续遍历数组,直到right指针指向7,此时sum小于target


be7e9e5da3e0c6e449cb3c45308ca5e6.png


4.右移左指针

与步骤2类似,当sum小于target时我们需要右移左指针,增加sum值使得两者更加接近:


670f88a475a2f3ab0a423deaca541680.png


5.匹配成功!

在当前case中,left指向2时sumtarget相等,匹配成功!

此时返回left值和right值在原数组中的下标即可:


7f085b85bce2a25edde6bf088f2b2adf.png


6.完整示例代码

示例代码如下:

45a501bc33e718251d7282c817a45e56.png

需要注意的是,由于JavaScript引用类型的特性,我们首先拷贝了nums,才使用Array.sort对拷贝数组进行排序。

另外,对于nums=[1,2,2,3],target=4这种case,其期望的返回值是[1,2]而不是[1,1]或者[2,2]。所以这里我们使用了Array.lastIndexOf()这个API。

小结

  • 采用碰撞双指针进行运算;

  • 碰撞双指针运算的时间复杂度取决于具体的排序算法,空间复杂度为O(n);

  • 碰撞指针需要对数组进行排序;

  • 排序时注意不要污染原数组;

  • 返回结果需要考虑数组含有相同项;

再复习一下暴力运算法和哈希表法:

  • 双层for循环暴力运算简单直观,时间复杂度O(n²)、空间复杂度O(1);

  • 哈希表法时间复杂度和空间复杂度都是O(n);

  • 考察点是对哈希表这种数据结构的熟悉程度;

  • 多一种解法就多一分胜算;

  • 整体难度不高。


一入JS深似海,希望「JS漫步指南」能在你乘风破浪的旅途中有所帮助!

转载地址:http://boxys.baihongyu.com/

你可能感兴趣的文章
2018.12.14 codeforces 932E. Team Work(组合数学)
查看>>
浅析C#中的Thread ThreadPool Task和async/await
查看>>
adb command not found / abd' 不是内部或外部命令,也不是可运行的程序 或批处理文件。最简易修改...
查看>>
java操作数据库的事务支持
查看>>
前端学习笔记 - Css初级篇
查看>>
Java8简明学习之新时间日期API
查看>>
The way to Go(7): 变量
查看>>
17秋 软件工程 第六次作业 Beta冲刺 Scrum1
查看>>
Javascript 解析字符串生成 XML DOM 对象。
查看>>
NOI2013 矩阵游戏 【数论】
查看>>
【算法题】找出一个整型数组里两个不同数字
查看>>
iOS开发--网络下载
查看>>
【第七次JAVA课,java语法基础】课件总结
查看>>
一些思维的碎片(一)
查看>>
Centos6 yum安装nginx
查看>>
日志级别简述
查看>>
如何获得运行在跨平台的信息和属性的情况下,文件
查看>>
default argument given of parameter 的问题
查看>>
SQL Server 中关于EXCEPT和INTERSECT的使用方法
查看>>
csdn肿么了,这两天写的博文都是待审核
查看>>