通配符匹配

思路:
- 创建一个 (len(p)+1)*(len(s)+1) 大小的数组lst,除了lst[0][0]外,其他的都为
False - lst是显示状态的数组,lst[i][j]标识当前p[:i]能匹配s[:j]
- 正式开始填充数组,首先数组初始化,用于填充第一行lst[0]。若当前p[i]==’‘ 且 lst[0][i-1]==True 的情况,lst[0][i]=True。 这个是覆盖``替代多个s中字符串的情况;
- 开始比对s与p:如果p当前字符不是* ,lst[i][j]=lst[i-1][j-1]
- 否则的话,lst[i][j]=lst[i-1][j](
*覆盖了多个s字符的情况) or lst[i][j-1](*等于空串的情况)
1 | def Solution(self, s: str, p: str) -> bool: |
是一个比较典型的dp,有比较典型的同类题型。和同类题型需要注意的地方在*
可被3整除

思路
- 一个数字,要么被3整除,要么余1或余2,只有这三种情况
- 一开始的想法是:余1+余2 || 余2x3 || 余1x3 ,这三种组合能够变成一个被三整除的数,结果发现如果按这个思路求结果还需要用dp算最优解,不划算;
- 看了别人的题解受到启发,整个nums相加后%3,若余1则减去数组中最小的余1数,余2减去最小的余2数,然后再返回
1 | def solution(nums): |
受污染的二叉树
思路:
- 从根节点开始,为左右子节点赋值,迭代
- 将当前节点值加入lst,lst为二叉树中出现的所有节点值
- 当整个树遍历完之后,看看要找的值在不在lst中
代码:
1 | class FindElements: |
这题蛮简单的,主要的问题在于lst的传递。一定要记得这种私有变量要在init函数里初始化,不然出事。
接雨水

思路:
- 下雨后能接到多少水,就是看有多少个坑。
- 假如有一个[3,2,1,4]的高度图,一定是用[4]和[3]当边界,因为选其他任何两个的计算的结果都会被他们俩覆盖;
- 所以从最高的柱子mid开始,以他为分界线向两边找最高的柱子,得到左边最高的柱子left和右边最高的柱子right
- 计算 [left,mid]+[mid,right]=[left,right]的体积,得到当前最大值
- 继续向left左边和right取最高的柱子,继续计算,直到得到总共水的体积。
代码
1 | class Solution: |
这题其实思路比较简单,难的地方一个在怎么找左右最高(切片数组传参),另一个在怎么判断迭代的出口。
螺旋矩阵

思路
- 没什么好思路,直接用Python列表自带的函数和切片做的
1 | class Solution: |