11、盛最多水的容器
双指针,算法中一个很重要的技巧,之前的三数求和就用到了双指针的技巧。
我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。 此外,我们会使用变量 maxArea
来持续存储到目前为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxArea
,并将指向较短线段的指针向较长线段那端移动一步。
1 | class Solution { |
12、整数转罗马数字
水题一个,模拟一下即可。
1 | class Solution { |
13、罗马数字转整数
水题,直接模拟
1 | class Solution { |
14、最长公共前缀
没啥好方案,直接暴力即可。暴力的方式有多种,一种像这里直接每次一个字符一个字符的得出 ans
,也可以挨个字符串直接与 ans(初值为字符串strs[0])
比较,逐渐缩小 ans
的长度,直到最后得出结果。
1 | class Solution { |
15、三数之和
三数之和其实和前面的两数之和原理一样,都是使用的双指针。这里的三数,其实可以直接固定一数,然后调用前面写的两数之和的代码。唯一的一点 trick
可能就是在去重上。
1 | class Solution { |
16、最接近的三数之和
和三数之和的原理一样,排序后使用双指针遍历找最优解。
1 | class Solution { |
17、电话号码的字母组合
一行深搜代码解决,2年没写搜索了,敲的时候好生疏。
1 | class Solution { |
18、四数之和
还是双指针操作(发现一个规律就是,前面这些和双指针操作相关的题目,一个典型的特点就是数组要先排个序),算法复杂度 $ O(n^3) $ ,其实有很多种解题方式。
第一种:双指针操作,先固定两个位置,然后 $ O(n) $ 的时间复杂度遍历剩下的元素,找解的过程中就去除可能存在的重复解,体现在代码中就是一片形式相同的while
循环。
第二种:还是双指针操作,在求解的过程中,我不管解是否存在重复,一一加到ans
里面,最后再进行一个去重处理。优点是编码简单,缺点是空间复杂度高,最坏情况下为$n^4$的空间复杂度(nums全为0,target也为0)。
第三种:以空间换时间,利用$ O(n^2) $的空间先求出两个数字的和,然后变成 两数之和
问题。
第四种:使用深搜操作,理论上来讲,此种方法可以求 m
数之和,时间复杂度为 $ O(n^{m-1}) $。
方案一代码:
1 | class Solution { |
19、删除链表的倒数第N个节点
一遍遍历即可,其实也是双指针的思想.
1 | /** |
20、有效的括号
水题,使用栈匹配一下即可,遇到左括号进栈,遇见右括号出栈,最后判断栈是否为空。
1 | class Solution { |