当前位置: 首页 > wzjs >正文

邹城建设银行网站搜索引擎优化的主要特征

邹城建设银行网站,搜索引擎优化的主要特征,深圳网站建设外包公司哪家好,云南省文化馆网站建设目录 问题描述 解决思路 关键点 代码实现 代码解析 1. 初始化结果和路径 2. 深度优先搜索(DFS) 3. 遍历候选数字 4. 递归与回溯 示例分析 复杂度与优化 回溯算法三部曲 1. 路径选择:记录当前路径 2. 递归探索:进入下…

目录

问题描述

解决思路

关键点

代码实现

代码解析

1. 初始化结果和路径

2. 深度优先搜索(DFS)

3. 遍历候选数字

4. 递归与回溯

示例分析

复杂度与优化

回溯算法三部曲

1. 路径选择:记录当前路径

2. 递归探索:进入下一层决策

3. 撤销选择:回溯到上一层

 代码框架模板

关键点解析

总结


问题描述

我们需要找出所有由 k 个不同数字组成的组合,这些数字的范围是 1 到 9,且它们的和等于 n。组合中的数字不能重复使用,且结果不能包含重复的组合。例如,当 k=3, n=7 时,唯一有效的组合是 [1,2,4]

解决思路

这个问题可以通过回溯算法解决。核心思想是递归地尝试每一个可能的数字,逐步构建符合条件的组合,并通过剪枝优化减少无效搜索。

关键点
  1. 数字范围固定:所有数字只能在 1-9 中选择。

  2. 组合唯一性:每个组合中的数字必须严格递增,避免重复(如 [1,2,4] 和 [2,1,4] 被视为同一组合)。

  3. 剪枝优化:在递归过程中,提前终止不可能满足条件的分支,大幅提高效率。

代码实现

var combinationSum3 = function (k, n) {const result = [];const path = [];const dfs = (start, sum) => {// 终止条件:路径长度等于k且和等于nif (path.length === k && sum === n) {result.push([...path]);return;}// 遍历候选数字for (let i = start; i <= 9; i++) {// 剪枝1:剩余数字不够组成k个数if (path.length + (9 - i + 1) < k) break; // 剪枝2:当前和超过nif (sum + i > n) break; path.push(i);dfs(i + 1, sum + i); // 递归下一层,起始位置为i+1path.pop();          // 回溯,撤销选择}};dfs(1, 0); // 从数字1开始,初始和为0return result;
};

代码解析

1. 初始化结果和路径
  • result:存储所有符合条件的组合。

  • path:记录当前递归路径中的数字。

2. 深度优先搜索(DFS)
  • 参数start 表示当前递归的起始数字,sum 表示路径中数字的当前和。

  • 终止条件:当路径长度等于 k 且和等于 n 时,将当前路径加入结果列表。

3. 遍历候选数字
  • 循环范围:从 start 到 9,确保数字递增,避免重复组合。

  • 剪枝1path.length + (9 - i + 1) < k
    如果当前已选数字数量加上剩余可用数字数量不足 k,说明无法组成有效组合,直接终止循环。
    例如:k=3,当前已选1个数字,剩余可用数字是 8 和 9(共2个),显然不够选2个。

  • 剪枝2sum + i > n
    如果当前路径和加上 i 已经超过 n,后续更大的数字只会让和更大,无需继续搜索。

4. 递归与回溯
  • 选择数字:将 i 加入路径,递归调用 dfs 处理下一个数字。

  • 撤销选择:递归返回后,将 i 从路径中移除,尝试其他可能的数字。

示例分析

以 k=3, n=7 为例:

  1. 初始调用dfs(1, 0)

  2. 第一层循环i=1,路径为 [1],和为1。

  3. 第二层循环i=2(起始为2),路径为 [1,2],和为3。

  4. 第三层循环i=4(起始为3),路径为 [1,2,4],和为7,满足条件,加入结果。

  5. 回溯:递归返回,尝试其他数字,但均无法满足条件,最终结果唯一。


复杂度与优化

  • 时间复杂度:最坏情况为 O(9! / (k!(9-k)!)),即组合数的时间。

  • 空间复杂度:递归栈深度为 k,空间复杂度为 O(k)

通过剪枝,实际运行时间远低于理论最坏情况,因为无效分支被提前终止。


回溯算法三部曲

回溯算法是解决组合、排列、子集等问题的经典方法。它的核心思想是递归地尝试所有可能的选择,并通过“撤销选择”回到之前的状态,从而穷举所有解。其实现过程可以总结为以下三个关键步骤:


1. 路径选择:记录当前路径

在每一步递归中,将当前的选择加入路径(通常是一个数组),表示“当前正在尝试这个选择”。
对应代码path.push(i)
作用:保存当前递归层的选择,用于后续判断是否满足条件。
示例:在组合问题中,选择数字 i 加入 path,表示尝试将 i 作为组合的一部分。


2. 递归探索:进入下一层决策

基于当前路径,递归调用函数,处理下一个选择(比如下一个数字或位置)。
对应代码dfs(i + 1, sum + i)
作用:进入下一层递归,继续尝试剩余的选择。
示例:在组合问题中,递归时从 i+1 开始,确保数字不重复且递增,避免重复组合。


3. 撤销选择:回溯到上一层

当递归返回后(即完成当前分支的探索),将最后加入路径的元素移除,回到上一层状态,尝试其他可能的选择。
对应代码path.pop()
作用:撤销当前层的选择,保证路径的正确性,避免污染其他分支。
示例:组合问题中,当尝试完以 i 开头的所有组合后,移除 i,尝试下一个数字。

 代码框架模板
function backtrack(路径, 选择列表) {if (满足终止条件) {将路径加入结果;return;}for (选择 in 选择列表) {做选择:将选择加入路径;backtrack(路径, 新的选择列表); // 进入下一层递归撤销选择:将选择从路径移除;    // 回溯}
}
关键点解析
  1. 路径的维护
    path 数组记录当前递归路径的选择,必须通过 push 和 pop 确保状态正确。

  2. 递归与回溯的关系
    递归是纵向深入探索一条路径,回溯是横向尝试其他可能的选择。递归的终点是终止条件,回溯的触发点是递归返回后的 pop

  3. 剪枝优化
    在组合问题中,通过以下两种剪枝大幅减少递归次数:

    • 剩余数字不足path.length + (9 - i + 1) < k
      例如:如果还需要选 2 个数字,但剩余可用数字只有 1 个,直接终止。

    • 和超过目标值sum + i > n
      当前路径和已经超过 n,无需继续递归

 


总结

该问题通过回溯算法枚举所有可能的组合,结合剪枝策略(剩余数字不足、和超过目标值)显著提高效率。核心在于:

  1. 递增选择数字:避免重复组合。

  2. 剪枝优化:减少不必要的递归调用。

  3. 回溯机制:撤销选择以尝试其他可能。

这种模式适用于许多组合问题,如子集、排列、组合总和等。

http://www.dtcms.com/wzjs/228702.html

相关文章:

  • 我想买个网站做时时彩河南网站推广优化排名
  • 网上书店网站建设毕业设计范文互联网推广话术
  • 智能家居产品设计案例网站排名优化查询
  • 做公司企业网站标准尺寸推广竞价的公司有哪些
  • 网站建设公司调查报告公司做个网站多少钱
  • 小程序平台开发多少钱合肥网站关键词优化公司
  • dw制作asp网站模板下载外贸seo
  • 网站开发职业要求百度推广客服电话24小时
  • 买网站做淘宝客北京专业seo公司
  • 过年wordpress主机桔子seo
  • 简单的美食网站模板太原建站seo
  • 网站页脚模板it教育培训机构
  • 做网站的zk啥网络广告推广
  • 不懂代码可以做网站吗宽带营销案例100例
  • 灯饰模板网站网站收录什么意思
  • 怎么做局域网asp网站网站推广多少钱一年
  • 安庆集团网站建设优化网站页面
  • 免费网站在线客服系统下列哪些店铺适合交换友情链接
  • 2018做网站前景如何2022最新新闻
  • 高端网站建设 案例网站seo技术能不能赚钱
  • 网站做多大尺寸上海关键词推广公司
  • 餐厅网站建设计算机培训班培训费用
  • 徐州专业网站制作公司网站排名优化培训哪家好
  • 网页设计跳转链接怎么制作seo岗位
  • 电子商务网站开发教程课后答案惠州seo网站推广
  • 兰州市门户网站营销自动化工具
  • 河北搜恒不给做网站大专网络营销专业好不好
  • 去泰国做赌博发网站可口可乐软文范例
  • 网站建设设计设计吸引顾客的营销策略
  • 网站换空间上怎么办啊营销技巧第三季