# 125、验证回文串
思路
双指针分别从前后开始遍历
先删除非字母数字 再翻转字符串与原文比较
# 392、判断子序列
思路
双指针从头开始遍历
动态规划
将待匹配字符串中每个字符从某个位置开始之后第一次出现的位置记下
加快每次寻找下一个匹配的字符位置的速度
# 167、两数之和 II
思路
二分查找
遍历一次数组寻找第一个数
对于第二个数,采用二分法进行查找
双指针
分别从头尾开始遍历
将二者的和与目标比较
同时调整指针位置
# 11、盛最多水的容器
思路
双指针(伪):单向双循环,找下一个更大的值,超时
双指针:双向单循环,始终移动值较小的那个指针,快
同时加上上述寻找下一个更大的值的思想,更快
# 15、三数之和
list.sort()
没有返回值,直接对原数组进行排序,默认升序
思路
快:排序 + 双指针,跳过相同值,借用两数之和 II 的思路
慢:哈希表,借鉴两数之和 I 的思想
# 135、分发糖果
思路
将原规则分成左规则和右规则
遍历数组两次,分别让其满足左右规则
最终对每个孩子的糖果数量取两个规则中的较大值即可
递增递减序列
递增序列直接下一个孩子糖果数量+1
递减序列则需要记录递减序列的长度,利用数列求和计算
我自己的方法
先遍历一次数组,用一个flag字典记录峰谷、递增递减的下标
再遍历一次字典,依次对谷、递减/递增、峰赋值,最终求和
# 42、接雨水
思路
动态规划
分别从头和从尾遍历一次数组
得到对于每个下标而言的前后最大高度
再遍历一次数组,计算每个下标处的水量
单调栈
不同于动态规划和双指针按照每列来计算,而是按照每行来计算
栈中存储单调递减的序列,每次遇到递增时,则出栈并计算水量
双指针
类似于动态规划的思想,不过只用遍历一次数组,而且额外空间 O(1)
同时维护左右两个指针,以及左右最大值两个变量,并计算每个下标处的水量
# 68、文本左右对齐
思路
模拟
对于每一行,统计单词加一个空格总长度,超过行的长度则到下一行
计算多余空格数量,对单词数量取模后,平均分配给靠前的单词后
注意处理特殊情况:最后一行 以及 一行只有一个单词