leedcode-双指针

双指针简介

分为两类:

  • 快慢指针:主要解决链表中的问题
  • 左右指针:主要解决数组 / 字符串中的问题

快慢指针

  1. 判断链表中是否含有环
  • 借助哈希表(判断哈希表中是否含有当前节点)
  • 使用快慢指针(快指针每次走两步,如果有环,二者会相遇)
  1. 已知链表中含有环,返回这个环的起始位置

思路:

  1. 先寻找快慢指针相遇的点
  2. 当二者相遇时,让其中一指针指向头节点,然后以相同的速度前进,再次相遇时所在的节点位置就是环开始的位置

证明:
在这里插入图片描述

  • 第一次相遇,假设 slow 走了 k 步,则 fast 走了 2k 步,设环起点到相遇点的距离为 m,则环起点距头节点 k - m;相遇点到环起点的距离为 2k - k - m 步(k- m)
  1. 寻找链表的中点
  • 快指针每次走两步
  1. 寻找链表的倒数第 k 个元素
  • 让快指针先走 k 步
  1. 删除排列数组中的重复项(leedcode-26)
  • 让快指针在前面探路,找到一个和满指针不同的元素时:nums[++slow] = nums[fast];

左右指针

  1. 二分查找
  2. 两数之和(leedcode-1)
  • 问题描述:给定一个已按照升序排列的有序数组,找到两个数使得他们相加之和等于目标数,返回下标
  • 只要数组有序,就应该想到使用双指针
  1. 接雨水(leedcode-42)
  • 问题描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水

思想:

  • 将问题细化为每一个柱子接的最大雨水,求和:ans += Math.min(l_max[k], r_max[k]) - height[k];
  • l_max:当前柱子左边的最高柱子(包括该柱子,避免出现负数)
  • r_max:当前柱子右边的最高柱子(包括该柱子)
  1. 暴力求解
  2. 使用备忘录先记录下 [1…n-2] 的左右最大值
  3. 使用左右指针记录左右最大值(从两边开始,谁小谁移动)
  1. 滑动窗口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值