day03 双指针
👉 day03 双指针
82. 删除排序链表中的重复元素 II
难度中等970
给定一个已排序的链表的头 head
, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
蛮力法
遍历链表 ,使用数组存储下每个值出现的次数, 然后再次遍历,
造一个新的链表, 返回即可
- 注意题目的数据 :
-100<=val<=100
1 | class Solution { |
🎈15. 三数之和
难度中等5138
给你一个包含 n
个整数的数组 nums
,判断 nums
中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?请你找出所有和为 0
且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
双指针
思路:
对数组进行排序
先设定一个前置的值
- 然后定义两个指针, 指向当前的值得后面的元素
l=i+1 , r=len-1
, 这里类似于二分的思想- 随后遍历数组 , 移动指针, 根据情况来调整
l r
的位置,注意对结果的
去重
- 数组的相邻两项相同
- 左右指针的前后两项相同
1 | /* |
👉day04 双指针
844. 比较含退格的字符串
难度简单494
给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意如果对空文本输入退格字符,文本继续为空。
双指针
字符数组定义两个指针,
一个
slow
用来统计有效的字符, 一个fast
用来遍历字符数组
遇到正常的字符就直接统计进去
chars[++slow]=chars[fast]
如果遇到了 #, 那么就需要 “退格” :
slow--
- 注意, 这一步的操作, slow必须>=0 , 否则后面统计字符的时候就会导致下标异常
1 | class Solution { |
986. 区间列表的交集
难度中等317
给定两个由一些 闭区间 组成的列表,firstList
和 secondList
,其中 firstList[i] = [starti, endi]
而 secondList[j] = [startj, endj]
。每个区间列表都是成对 不相交 的,并且 已经排序 。
返回这 两个区间列表的交集 。
形式上,闭区间 [a, b]
(其中 a <= b
)表示实数 x
的集合,而 a <= x <= b
。
两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3]
和 [2, 4]
的交集为 [2, 3]
。
本题需要求的是 , 两个区间的数组的展开的所有的交集
双指针
-
定义p1,p2 两个指针, 分别指向两个二维数组
-
比较两个区间
- 对于左边界, 对应的是 两个区间的较大值
int l=Math.max(arr1[0],arr2[0]);
- 对于右边界, 对应的是两个区间的较小值
int r=Math.min(arr1[1],arr2[1]);
- 对于左边界, 对应的是 两个区间的较大值
-
我们比较两个区间的右边界, 将右边界较小的那个二维数组的指针右移
- 可以考虑一种比较极端的情况来辅助理解:
在上面的这种情况中,
secondList
的范围远大于firstList
, 通过这个不难理解为什么我们要将右边界较小的那个二维数组的指针右移
1 | class Solution { |
🎈11. 盛最多水的容器
难度中等3724
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
思路:
面积 :
math.min(height[i],height[j])*( j-i)
双指针:
定义左右两个指针, 分别指向数组左右两侧
每次向里面收缩
i ,j
中的较短的那个板, 维护res
i, j
相遇时结束最会返回
res
- 注意
(j-i)*height[i++]
以及(j-i)*height[j--]
的相乘的顺序, 需要吧j-i
放到前面, 否则会少乘
每次收缩短板的原因:
-
若向内 移动短板 ,水槽的短板
min(h[i],h[j])
可能变大,因此下个水槽的面积 可能增大 。 -
若向内 移动长板 ,水槽的短板
min(h[i], h[j])
不变或变小,因此下个水槽的面积一定变小- 注意 : 水槽的面积取决于短板以及底部的宽度 , 因此我们需要想办法让短板变得更大 , 所以说移动长板水槽的总面积一定会减小
1 | class Solution { |