文章目录
- 1. 双指针
- 1.1 两数之和
- 1.2 三数之和
- 1.3 盛最多水的容器
- 1.4 接雨水
- 2. 字串
- 2.1 滑动窗口最大值
- 3. 动态规划
- 4. 多维动态规划
- 4.1 最长回文字串
1. 双指针
1.1 两数之和
思路:因为是有序数组,
1.2 三数之和
题目要求不能重复
思路:三数之和可以变为两数之和,固定一个数字,看两数之和,此时target变为target-固定的数字,要先对数组排序,然后依次固定一个数求两数之和。
避免重复解:
重复解有两种情况:
- 固定数字的时候 【-1,-1】已经固定过-1,得出了一组解,又有一个-1,得出得还是同一组解,重复-----> 解决:在固定数字的时候,判断前一个是不是和自己一样,一样就跳过(这样做是因为数组已经有序)
- 两数之和双指针寻找的时候,【-1,0,0,1,1】 -------> 解决:在双指针移动的时候,当左指针和它前面元素一样时,i++,当右指针和它后面一个元素一样时,j–
1.3 盛最多水的容器
思路:双指针解决:两个指针分别指向最左和最右,计算容量,因为最左和最右宽度是最大的,每次都是移动较低的那一边,这样宽度减小了但是高度增加了才有可能容量变大,每次移动后计算容量,做max,取大的。
1.4 接雨水
思路:单调栈解决:将柱子依次入栈,要入栈的柱子小于栈顶柱子高度时,可以入栈,当要入栈的柱子高度大于栈顶柱子的高度时(此时表示形成凹陷,可以接水),此时计算凹陷:将栈顶的这个柱子出栈,该出栈柱子的左边也就是现在的栈顶就是凹陷的左边,入栈的这个柱子就是凹陷的右边,取左右的最小高度,该最小高度减去出栈柱子的高度就是凹陷的高,左右之差就是凹陷的宽,算盛水量。这样依次尝试将所有柱子加入单调栈中,有凹陷就出栈,并计算容量,最后sum,得到总容量。
2. 字串
2.1 滑动窗口最大值
思路:单调队列解决(对头就是最大值),遍历数组将每个元素入队,当窗口大小都充满元素时出队。
3. 动态规划
4. 多维动态规划
4.1 最长回文字串
思路:不用动态规格,用中心开发的思想
两种情况:
- 回文子串是奇数(中点有一个字符 aba):依次遍历字符串,并认为该字符是中心,判断中心的前后字符是否一样,一样再判断前面的前面和后面的后面是否一样,并且用两个变量记录回文的left 和 right
- 回文字串是偶数(中点两个字符 abba):依次遍历字符串,每次取两个字符并且要相等,再以中心扩展,一样则记录回文的left 和 right