点击上方蓝字设为星标
下面开始今天的学习~ 本文来源于力扣圈子,作者:小白二号 原文链接:https://leetcode-cn.com/circle/article/7FXJsv/背景
搜索是优化算法题的本源。所有的优化算法题均是在一个有限的搜索空间中,寻找最优解答。注意这里是有限的搜索空间,就算是实数的返回,也会有精度的要求,就算是二分,也会有搜索的上下界。
有些朋友在学习递归,回溯,动态规划,深度优先搜索,广度优先搜索等算法问题时,时常搞不清楚状态对象和状态转移。因此我开这个话题,聊聊搜索中的状态空间,以及高级算法中的思考方式。
搜索通解
假设一个题目的状态为 A,那么这个题目的通解是:
Java 实现
void search() {
// 枚举所有的状态 for (A a : all) {
collect(a); }}
简单而言,就是枚举所有的状态值,对于每一个状态值,判断这一个状态值是否成立,如果成立,这个状态就纳入计算,至于这个计算是什么,就看题目的要求,比如说,01 背包的算总价值,迷宫题目的算长度等等。
状态
搜索题中,题目蕴含的每个变量都有一个上下界,而每个变量组合取值形成了状态空间。树的遍历题中,跟到叶子的路径是一个状态,图论题中,源点到所有点的所有路径都是一个状态。状态在理解题意后很容易找到,我随便挑几个题来分