第一篇:双指针法及习题
双指针包括快慢指针、左右指针和滑动窗口。
力扣11、盛最多水的容器
思路:利用左右指针。一开始左指针指向数组最左边,右指针指向数组最右边。储水量等于左右垂线中较短的那个垂线的高度,与垂线间距的乘积。每次算完储水量后,就得右移左指针或者左移右指针了。那么什么时候右移左指针,什么时候左移右指针呢?假设左边的垂线较短,那么此时左移右指针的话,乘积会变小,因为高度没有增加,而间距又变小了,所以只能右移左指针。同理,右边的垂线较短的话,得左移右指针,因为右移左指针的话,高度没有增加,间距又变小了。总结起来就是,谁小移动谁。当然,要保证左指针往右移,右指针往左移,且左指针在右指针左边。
力扣15、三数之和
思路:利用左右指针。先给数组排序。第一个数从索引0开始,第二个数即左指针,初始位置是第一个数的下一位,第三个数即右指针,初始位置是数组的右边界。如果当前三个数的和小于0,那么将左指针右移一位;如果当前三个数的和大于0,那么将右指针左移一位;如果当前三个数的和等于0,那么记录这三个数,然后往右移动左指针,直到值不等于第二个数。对右指针同样如此,往左移动右指针,直到值不等于第三个数。指针移动过程中,要保证左指针始终在右指针左边,否则,将第一个数往右移动一位,左指针、右指针位置分别重置为第一个数的下一位及数组右边界。
力扣16、最接近的三数之和
思路:利用左右指针。先给数组排序。第一个数从索引0开始,第二个数即左指针,初始位置是第一个数的下一位,第三个数即右指针,初始位置是数组的右边界。如果当前三个数的和小于target,那么记录当前三数之和及其与target的差值,如果差值小于已记录的最小差值,则更新最小差值,并将左指针右移一位;如果当前三个数的和大于target,那么记录当前三数之和及其与target的差值,如果差值小于已记录的最小差值,则更新最小差值,并将右指针左移一位;如果当前三个数的和等于target,那么直接返回target。指针移动过程中,要保证左指针始终在右指针左边,否则,将第一个数往右移动一位,左指针、右指针位置分别重置为第一个数的下一位及数组右边界。
力扣18、四数之和
思路:利用左右指针。
力扣19、删除链表的倒数第N个节点
思路:利用快慢指针。快慢指针的思路是建两个指向头节点的指针,先让慢指针不动,快指针移动一定次数(次数和最终慢指针的位置有关系),然后快、慢指针再同时移动直到快指针指向null。一开始慢指针也可以指向哑结点,即自己新建的dummy节点、hair节点。
建一个快指针指向头节点,建一个慢指针指向hair节点。 先让快指针移动N次,然后让快慢指针一起移动,直到快指针指向null,这时慢指针指向的其实就是倒数第N个节点的前驱节点了,操作其next属性即可。最后返回hair.next。
力扣26、删除有序数组中的重复项(简单)
思路:利用快慢指针。慢指针从索引0开始,快指针从索引1开始。比较快慢指针指向的值是否相等,如果相等,那么快指针往右移动一位。如果不相等(快慢指针指向的值不相等,说明快指针指向的值和【慢指针指向的值及其左侧的值】都不相等),那么把慢指针索引加1的位置赋值为快指针指向的值,并且快、慢指针同时往右移动一位。如此,直到快指针到达右边界。那么基数个数就是慢指针的索引加1。题目中的数组不是一般数组,而是非严格递增数组,形如0、1、1、2、3、4、4、5,若是一般数组的胡啊,是不能用此解法的。
力扣27、移除元素
思路:把值不等于目标值的元素往左推。
力扣61、旋转链表
思路:利用快慢指针。思路和找链表的倒数第N个节点一样。
力扣88、合并两个有序数组
浙公网安备 33010602011771号