在小liuliu始终觉得他的算法与菜肴进行比较之前,这是一个短板。过去,问题实际上是三天的钓鱼。第二,在平台的活动的帮助下,我计划开始缓慢刷牙,并总结我必须刷牙的问题,谈论我的一些想法以及我自己的想法等等。我希望这对我的朋友有帮助。您也可以借此机会弥补您的短板,希望我能坚持下去
给定两个整数以及在返回范围内所有可能数字的组合。
您可以按任何顺序返回答案。
实际上,这个问题有点像我们数学的知识点。2,您实际上可以做到这一点
但是不幸的是,我们不能将其视为一般写作,因为当N和K很大时,您猜想要死,所以请使用后可追溯性
实际上,该问题的解决方案是回顾性方法。什么是返回痕迹?
回顾性方法(探索和回顾方法)是一种选择搜索方法,也称为测试方法,是根据选择条件向前搜索以实现目标的。但是,当涉及到一定步骤时,发现原始选择不是出色或无法实现目标,因此我将回到重新选择的步骤。这种不可用的技术将返回后回顾方法,并符合可追溯的后退[条件]。状态点称为“后痕点”。
在回顾性方法中,每次当前部分扩展时,它都面向可选状态集合,并且该解决方案的新部分由此集合中的选择选择。在此收集状态下,其结构是多fork树。每个树节点代表解决方案的可能部分。它的儿子是由其产生的其他部分。树的根是最初状态的,这种状态集合称为状态太空树。
RISSES的恢复方法的生成通常用于逐步扩展解决方案。每个步骤是根据解决方案的当前部分扩展解决方案。它从启动节点(根节点)开始问题,并以深度的优先级搜索整个状态空间。此开始节点成为一个活节点,也是当前的扩展节点。在当前扩展节点时,搜索将移动到新的节点深度。此新节点成为一个新的活点并成为当前的扩展节点。如果您不能再在当前的扩展节点中移动,那么当前的扩展节点将变成一个死节点。这次,您应该返回到最近的生活节点并使此生活起来节点一个当前的扩展节点。回顾性方法以这种方式递归地在状态空间中搜索,直到发现所需的解决方案或解决方案空间中没有活着的节点为止。
与背景方法有一定的联系,它们是基于暂定的。糟糕的方法后,您需要在检查是否满足条件之前生成解决方案的所有部分。如果不满足,请放弃完整的解决方案,然后尝试另一个可能的完整解决方案。每个部分的过程逐渐恢复。对于回顾性方法,解决方案的每个部分都是逐渐生成的。当当前生成的当前生成部分的某些部分不符合约束条件,放弃完成的工作,撤退到上一步以进行新的尝试,而不是放弃整个整个整个过程。
在确定问题的解决方案空间结构之后,回顾性方法将从启动节点(根节点)开始,以更优先的方式搜索整个解决方案空间。启动节点成为实时节点,也成为扩展节点。当前的扩展节点,搜索并移至新的节点深度。这个新节点成为一个新的活节点,并成为当前的扩展节点。如果您不能再在当前的扩展节点中移动,那么当前的扩展节点将变成死节点。这次,您应该移至最近的生活节点和使其成为当前的扩展节点。上述回顾方法的方法在解释空间中递归搜索,直到空间中所需或未解决的空间不可用。
回顾性方法使用的关键要素是以下三个点:
(1)为给定问题定义问题的解决方案;
(2)确定易于搜索的解决方案结构;
(3)搜索和搜索空间的深度优先级,并在搜索过程中使用修剪功能,以避免搜索无效。
因此,上述问题的结合是解决它
实际上,我们发现实际上有更多的优化点。我们称其为分支机构的减少
减少分支的地方是我们遍历的条件,在J <= n之前,现在J <= n-(k-temp.size())+1
让我们看一下为什么我们可以做到这一点。每个人都认为,如果我们想要n = 4,k = 3,那么如果我们从2点开始穿越,因为我的开始索引背后有3,4个是3,实际上不是必不可少的,因为不管是什么它在后面,只有4个,最多3,4,并且根本无法达到k = 3。
已选择的元素数量:temp.size();
您需要的元素数为:k -path.size();
最多来自集合n:n-(k -path.size()) + 1的起始位置,开始遍历
因此,减少分支的条件为j <= n-(k-test.size())+1,您可以将n = 4,k = 3放在顺序
好的,今天在这里。接下来,我们可以继续分享相关问题并加强实践。
原始:https://juejin.cn/post/7103143480792186916