Leetcode解题思想总结篇:双指针
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个指针:start ,end来记录范围。注意循环条件和判断条件:(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 相关题目
- Summary Ranges
- Linked List Cycle
- Linked List Cycle II
- Remove Duplicates from Sorted List I
- Remove Duplicates from Sorted List II
- Remove Duplicates from Sorted Array I
- Remove Duplicates from Sorted Array II
- Partition List
- Intersection of Two Linked Lists
- Remove Nth Node From End of List
- Reorder List
- Delete Node in a Linked List
4 注意
- 通常需要特别留意链表长度的奇偶性
- 如果快指针步速为慢指针步速2倍,循环条件为:
faster.next!=null && faster.next.next!=null - 当自行设置快指针步长时, 要考虑步长值等于链表长度的特殊情况
- 查找倒数第n个时,如果要求删除链表元素时,不要忘记记录应被删除元素的前一个元素
- 对于链表的题目,常常都会用到
Two Pointers的思想。链表注意构建dummy头结点。在Java中,由于没有free函数,所以在删除一个节点的时候,无法用node = null来删除一个节点,需要用前一个节点来指向删除节点的下一个prev.next = node.next这样来删除node节点。
5 参考
Leetcode解题思想总结篇:双指针的更多相关文章
- LeetCode解题记录(贪心算法)(二)
1. 前言 由于后面还有很多题型要写,贪心算法目前可能就到此为止了,上一篇博客的地址为 LeetCode解题记录(贪心算法)(一) 下面正式开始我们的刷题之旅 2. 贪心 763. 划分字母区间(中等 ...
- LeetCode解题报告:Linked List Cycle && Linked List Cycle II
LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...
- leetcode解题报告(2):Remove Duplicates from Sorted ArrayII
描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
- Leetcode解题思路总结(Easy篇)
终于刷完了leetcode的前250道题的easy篇.好吧,其实也就60多道题,但是其中的套路还是值得被记录的. 至于全部code,请移步github,题目大部分采用python3,小部分使用C,如有 ...
- LeetCode解题记录(双指针专题)
1. 算法解释 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务.也可以延伸到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域 ...
- LeetCode解题思路
刷完题后,看一下其他人的solution,受益匪浅. 可以按不同的topic刷题,比如数组.字符串.集合.链表等等.先做十道数组的题,接着再做十道链表的题. 刷题,最主要的是,学习思路. 多刷几遍.挑 ...
- leetCode解题报告5道题(六)
题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- 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 ...
随机推荐
- mysql查询练习
mysql> #查询每个栏目最贵的商品 mysql> select goods_id,shop_price,cat_id from (select goods_id,shop_price, ...
- spring MVC fromeWork 與webwork2 mvc 比較
http://www.blogjava.net/xxxzheng/articles/7614.html 在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+Sp ...
- VS2015 Cordova Ionic移动开发(一)
一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找到Cordova选项: 运行依赖关系查看器,用来检测开发环境是否完整. 如果检测显示: 那么就是环境配置完成了.可以直 ...
- windows下Nginx配置与测试
1.获取 下载地址:http://nginx.org/en/download.html 参考网址:http://nginx.org/en/docs/windows.html 2.准备工作 ...
- xcode 最近打开文件列表显示为空或不显示最近打开的项目或(no recent projects)解决办法
如果使用的是10.10 系统,打开系统设置-->进入通用-->在最下面的"最近使用的项目"中将0改为你可以接受的选项 如果不是10.10,那么就从系统偏好设置---&g ...
- iOS-开发记录-UIView属性
UIView属性 1.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = ; // 不透明 view.alpha = ; 2.clipsToBounds // 默认是N ...
- ServiceStack.Redis 破解
在github上下载了ServiceStack.Redis,做测试发现有限制,居然从v4开始就收费,无聊时,做了个源码分析 废话不多,上测试代码 try { ; i < ; i++) { red ...
- ImageIcon图像处理相关测试【一些特殊的处理方式】
/*************以下源码通过测试******************************/ package cn.jason.ios.images; import java.awt.F ...
- ZOJ 1025 Wooden Sticks(快排+贪心)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25 题目大意:机器运送n个木条,每个木条有一个长度和重量.运送第一根木 ...
- 01_C语言基础
内容提要: 1. C语言概述2. 数据类型.运算符与表达式3. C语言程序结构 4. VC6.0使用练习 知识详解01:C语言的历史 1. C语言与其它语言比较 汇编语言: (1).可直接对硬件进行操 ...