欢迎访问我的博客
滑动窗口
常用在数组和字符串的操作上面。
可以用来解决一些查找满足一定条件的连续区间的性质(长度等)的问题。由于区间连续(单调递增或者单调递减)
因此当区间发生变化时,可以通过旧有的计算结果对搜索空间进行剪枝,这样便减少了重复计算,降低了时间复杂度。
往往类似于“ 请找到满足 xx 的最 x 的区间(子串、子数组)的 xx ”
动态规划,
是一种暴力方法,下一步的操作时通过上一步的某条件达到的。
写出表达式和约束条件即可达到目的
动态规划一般会超出时间限制,如果是dp就生成一维数组,如果是dp[i][j]就生成二维数组。
反正就是个多维数组保存每一种情况下的办法。
分治法
一个问题可以拆成两个或多个“相似”的小问题,就一定要用分治法。
因为小问题可以拆到简单的直接求解
回朔法,深度遍历dfs
是一种暴力方法
试探性一步一步的看能否到达终点。
如果当前的方法可行满足约束条件,且下一步操作也可行。就往下走
如果下一步是死路就不往下一步走,悔棋,更换当前的可行方法是自己满足约束条件
单调栈
维护一个单调递增或者单调递减的栈。如果是递减栈,遇到一个比栈顶元素还要小的元素,
就一直推出元素直到这个元素作为栈顶元素时依旧是一个递减栈。
通常用这种数据结构解决一种公共区间内最大或最小值。
比如木板长短不一怎样能打最多的水,柱状图的最大矩形。
二分法
一种搜索方法,在一种具有单调性的队列中,快速搜索目标
总结
- 如果遇到必须用暴力的算法来解决的问题,一般都会用一个栈来进行维护减少重复操作。
就比如回朔法,给之前走过的可行步骤做一个存储,如果下一步骤可行的操作在存储里存在
就调用存储的方法 - 能用dp算法的一般也能用回朔法。如果当前可选择的方法量比较少推荐用回溯
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。