其实,就像以为前辈说的一样,不管做题或者说思考的时候用的是哪种算法或者逻辑,**计算机的底层解决问题其实都是离不开穷举,把所有的结果穷举出来然后在所有的结果中挑出最优解即可呗。
**只不过呢,
- 有的穷举的闷头闷脑,哼哧哼哧的,所以时间复杂度比较高
- 有的穷举逻辑很巧妙,所以时间复杂度很低
- …
一般递归类的问题(也叫动态规划类问题,经常有这种记得不,dp[i]、dp[i][j]、dp[i][j][k]…,人家也把这叫做状态,那TreeNode left = xxxXxx(root.left,…),其实感觉也差不多是一个师门出来的)
- 咱们无非就是先好多好多层for循环呀、while循环呀整出暴力穷举算法,搞出dp[i]=…、dp[i][j]=…、dp[i][j][k]=…就相当于找出咱们的状态转移方程了呗
- 然后呢,为了不干重复的事降低咱们遍历的效率(其实在咱们Java那块也是一样的,为了方便提高代码执行效率,咱们经常会封装出XxxTemplate.java或者XxxUtils.java等),用个集合记录一下代码中走过路过的,然后排除一下去除一下重复的东西
加个备忘录就成了自顶向下的动态规划解法了,再改一改,优化一下(一个状态只与前两个状态有关,所以我可以只缓存前两个状态)就成了自底向上的迭代解法了
未完待续…
巨人的肩膀:
labuladong老师,推荐一下他的公众号,干货多多