Leetcode解题思想总结篇:双指针

1概念

双指针:快慢指针。
快指针在每一步走的步长要比慢指针一步走的步长要多。快指针通常的步速是慢指针的2倍。

在循环中的指针移动通常为:
faster = faster.next.next; slower = slower.next;

2 应用

2.1. 用来判断链表是否有环以及寻找环入口

  • Linked List Cycle
  • Linked List Cycle II

是否有环:快慢指针思想,注意循环条件:(fast != null) && (fast.next != null)

寻找环的入口:快慢指针相遇的时候,distance(fast指针) = 2 * distance(slow指针),可以推导出,只要把fast重新指向头结点,两个指针以一样的速度走,相遇的时候,便是环的入口。

2.2.数组寻找范围

  • Summary Ranges

范围的寻找,用2个指针:startend来记录范围。注意循环条件和判断条件:(end + 1 < len) && (nums[end + 1] == nums[end] + 1)

2.3.链表或者数组中移除重复的元素

  • Remove Duplicates from Sorted List I
  • Remove Duplicates from Sorted List II

Sorted List I用两个指针一前一后指向链表。维护两个指针:

  • tail 一个指向当前不重复的最后一个元素,
  • pCur 一个进行依次扫描,遇到不重复的则更新第一个指针,继续扫描,否则就把前面指针指向当前元素的下一个(即把当前元素从链表中删除)。

Sorted List II 维护两个指针:

  • prev前驱指针指向上一个不重复的元素
  • pCur遍历指针
    思路类似Sorted List I,细节更多。
    寻找不重复的元素 while循环条件pCur.next != null && prev.next.val == pCur.next.val

Array数组中的解题思想一样:

  • index指向上当前不重复的最后一个元素
  • i遍历数组

2.4. 用来找中点或中位数

2.5. 倒数第n个

题目中含有:倒数第n个,那么设置快指针步长为n,然后快慢指针同时以同一速度走,用慢指针寻找倒数第n个

2.6. 拆分链表

Partition List

给定一个x的值,小于x都放在大于等于x的前面,并且不改变链表之间node原始的相对位置。example中 4->3->5都是大于等3的数,这保持了他们原来的相对位置。

使用链表最常用的双指针:

  • 一个指向当前小于x的最后一个元素
  • 一个进行往前扫描。如果元素大于x,那么继续前进,否则,要把元素移到前面,并更新第一个指针。

Reorder List

思路:
1.利用快慢两个指针将链表一分为二;
2.针对第二个子链表求倒序;
3.利用merge思想将两个子链表合并。

3 相关题目

4 注意

  1. 通常需要特别留意链表长度的奇偶性
  2. 如果快指针步速为慢指针步速2倍,循环条件为:faster.next!=null && faster.next.next!=null
  3. 当自行设置快指针步长时, 要考虑步长值等于链表长度的特殊情况
  4. 查找倒数第n个时,如果要求删除链表元素时,不要忘记记录应被删除元素的前一个元素
  5. 对于链表的题目,常常都会用到Two Pointers的思想。链表注意构建dummy头结点。在Java中,由于没有free函数,所以在删除一个节点的时候,无法用node = null来删除一个节点,需要用前一个节点来指向删除节点的下一个prev.next = node.next这样来删除node节点。

5 参考

Leetcode解题思想总结篇:双指针的更多相关文章

  1. LeetCode解题记录(贪心算法)(二)

    1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...

  2. LeetCode解题报告:Linked List Cycle && Linked List Cycle II

    LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...

  3. leetcode解题报告(2):Remove Duplicates from Sorted ArrayII

    描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...

  4. Leetcode解题思路总结(Easy篇)

    终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...

  5. LeetCode解题记录(双指针专题)

    1. 算法解释 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务.也可以延伸到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域 ...

  6. LeetCode解题思路

    刷完题后,看一下其他人的solution,受益匪浅. 可以按不同的topic刷题,比如数组.字符串.集合.链表等等.先做十道数组的题,接着再做十道链表的题. 刷题,最主要的是,学习思路. 多刷几遍.挑 ...

  7. leetCode解题报告5道题(六)

    题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...

  8. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  9. LeetCode解题报告—— 2 Keys Keyboard & Longest Palindromic Substring & ZigZag Conversion

    1. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...

随机推荐

  1. react 编写组件 五

    看以下示例了解如何定义一个组件 // 定义一个组件LikeButton var LikeButton = React.createClass({ // 给state定义初始值 getInitialSt ...

  2. java中split以"."分割的问题

    今天开发中使用字符串分割函数split(),发现:输出的并不是想要的结果 或者直接报错都有可能 查询后才发现,需要转译 原来在java中函数split(".")必须是是split( ...

  3. SQL Server调优系列基础篇 - 联合运算符总

    前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...

  4. PHP简单MVC架构

    http://blog.csdn.net/haiqiao_2010/article/details/12166283 由于需要搭建一个简单的框架来进行API接口开发,所以简单的mvc框架当然是首选.最 ...

  5. iOS app提交审核 11.13条款问题

    今年开年到现在.提交app应用一直招拒,这个问题我想不明白,感觉就是一个坑.所以贴出来给大家看看. 发件人 Apple11.13 - Apps that link to external mechan ...

  6. 使用Eclipse提供的Axis1.x生成WSDL文件以及Server和Client代码

    使用Eclipse自带的Axis 1.x来创建一个web service应用的服务端和客户端 Axis 是SOAP WebService协议实现,SOAP实质上是一个基于HTTP POST的请求,以X ...

  7. 【CF493E】【数学】Vasya and Polynomial

    Vasya is studying in the last class of school and soon he will take exams. He decided to study polyn ...

  8. MongoDB笔记(三)启动命令mongod的参数

    上一节有关访问权限的笔记,是由启动命令mongod的参数auth引发的有关问题,这节就来看看mongod的其他参数 MongoDB启动命令mongod参数说明: 基本配置 --quiet # 安静输出 ...

  9. ubuntu下编译安装apache

    官网http://httpd.apache.org/download.cgi下载apache源码包后 /*解包*/ gzip -d httpd-2_x_NN.tar.gz tar -xf httpd- ...

  10. Ubuntu 之旅—— 调整扩展屏分辨率

    打开终端输入 xrandr 得到如下信息 Screen 0: minimum 320 x 200, current 2390 x 768, maximum 8192 x 8192 LVDS conne ...