分享|双指针题单(均有个人精品题解)
7755
2024.06.11
2025.02.09
发布于 安徽

很多简单与中等难度题是套路题,读者在初次接触的时候感到棘手很正常,不必灰心!

思维发散训练

345. 反转字符串中的元音字母个人题解
674. 最长连续递增序列个人题解
42. 接雨水个人题解

偏移元素

最简单的思路是对符合条件的元素计数,然后放入指定位置,但循环不变量的思路很值得学习。

27. 移除元素个人题解
283. 移动零个人题解
26. 删除有序数组中的重复项个人题解
80. 删除有序数组中的重复项 II个人题解

严格来说,循环的地方都涉及到循环不变量。然而在循环不变量显而易见的场景中,我们不会强调这个名词,所以本小节的循环不变量特指那些稍有难度的。

常规相向滑动

167. 两数之和 II - 输入有序数组个人题解
15. 三数之和个人题解
1099. 小于 K 的两数之和(会员题)及个人题解
16. 最接近的三数之和个人题解
18. 四数之和个人题解

不定向滑动

11. 盛最多水的容器个人题解
795. 区间子数组个数个人题解
581. 最短无序连续子数组个人题解
881. 救生艇个人题解
1793. 好子数组的最大分数个人题解

快慢指针

160 相交链表个人题解
141. 环形链表个人题解
19. 删除链表的倒数第 N 个结点个人题解
2095. 删除链表的中间节点个人题解
143. 重排链表个人题解
202. 快乐数个人题解
142. 环形链表 ||个人题解
287. 寻找重复数个人题解

不包括

  • 一些很简单的问题。比如比对两个数组或者模拟。我认为这是很最基础的知识,在学习语言的时候就该练习了。

  • 滑动窗口。这在广义上也属于双指针,但其变形较多,Leetcode 将其独立出来,可参考灵茶山艾府给的滑动窗口题单

  • 双指针与高级知识结合的题。双指针滑动是基础知识,有时仅作为困难题中的一个工具。对于这种难题,个人认为应在学习高级知识的时候练习,不在本题单之内。

个人题解说明

  • 有些题比较简单或者你可能做过,但我在一些题解中做了引申,并且分析视角经常不同,希望你至少浏览一遍。
  • 分析偶尔涉及一些数学符号,具体参考另一篇 Leetbook 的符号。读者可先看一遍,或者在存疑时比对。复杂度分析中,个人偏向更精确的分析,经常用到 ,读者兴趣不足视为 即可。
  • 围绕一维数组或字符串的双指针习题大多有类似如下的朴素解法(此处临时采用伪代码)
void native(int[] nums): Int
    int ans = 0;
    int n = nums.length;

    for (int l = 0; l < n; l++) {      
        for(int r = l; r < n; r++){
            if l 和 r 的相关信息更符合条件
  ​				更新 ans
        }
    }

return ans

但能明显看出时间复杂度 。虽然这在实际开发中可能是最优解法,但面试本着区分候选人的原则,会围绕可以降低时间复杂度的技巧来出题。

这类题的实现方式一般不唯一,重要的是能理清过程和处理好边界条件。可以画图辅助,但最好能直接脑补出动画。在题目做多后,即使面对一些非常规题,也可能自然想到一些更省力的处理过程。

推广

以下皆为个人所著,兼顾了职场面试和本硕阶段的学术考试。

点赞关注不迷路。祝君早日上岸,飞黄腾达!

也欢迎分享你的阅读感受,以便我日后改进。

评论 (2)