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

南昌网站建设电话陕西建设招聘信息网站

南昌网站建设电话,陕西建设招聘信息网站,青岛建设银行网站首页,大学生创业2月亏3万一、题目 给定一个候选人编号的集合 candidates 和一个目标数 target #xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意#xff1a;解集不能包含重复的组合。 二、解题思路 排序#xff1a…一、题目 给定一个候选人编号的集合 candidates 和一个目标数 target 找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意解集不能包含重复的组合。  二、解题思路 排序首先对 candidates 数组进行排序这样可以避免在搜索过程中重复使用相同的元素并且可以利用已经排序的特性来剪枝。 回溯搜索使用递归函数进行回溯搜索每次选择一个候选数字并从剩余的候选数字中继续寻找可能的组合。 剪枝在搜索过程中如果当前的数字和已经达到或超过目标数 target则直接返回不再继续搜索。同时如果当前选择的数字与上一次选择的数字相同为了防止重复也需要剪枝。 结果存储当找到一个有效的组合时将其添加到结果列表中。 三、具体代码 import java.util.ArrayList; import java.util.List;public class Solution {public ListListInteger combinationSum2(int[] candidates, int target) {ListListInteger result new ArrayList();ListInteger combination new ArrayList();Arrays.sort(candidates); // 对候选数组进行排序dfs(candidates, target, 0, combination, result);return result;}private void dfs(int[] candidates, int remain, int start, ListInteger combination, ListListInteger result) {if (remain 0) { // 如果当前剩余值为0说明找到了一个有效的组合result.add(new ArrayList(combination)); // 将当前组合添加到结果中return;}for (int i start; i candidates.length; i) {if (remain - candidates[i] 0) break; // 剪枝如果当前数字使剩余值小于0则不再继续if (i start candidates[i] candidates[i - 1]) continue; // 跳过重复的数字combination.add(candidates[i]); // 选择当前数字dfs(candidates, remain - candidates[i], i 1, combination, result); // 递归搜索剩余的组合combination.remove(combination.size() - 1); // 回溯移除当前数字}} } 四、时间复杂度和空间复杂度 1. 时间复杂度 排序步骤Arrays.sort(candidates) 是对输入数组进行排序的步骤其时间复杂度通常是 O(n log n)其中 n 是数组 candidates 的长度。 DFS搜索深度优先搜索DFS是算法的核心部分。在每次递归中我们遍历数组 candidates 并尝试每个可能的数字。由于数组已经排序我们可以通过剪枝来避免不必要的搜索例如跳过重复的数字和超出目标值的组合。理想情况下每次递归都会减少目标值 remain直到 remain 为 0此时我们找到了一个有效的组合。在最坏的情况下如果目标值 target 可以通过数组中的多个不同组合来达到那么我们需要遍历所有可能的组合。因此DFS搜索的时间复杂度可以表示为 O(2^n)其中 n 是数组 candidates 的长度。然而由于剪枝的存在实际的搜索空间会小得多。 总结来说排序步骤的时间复杂度是 O(n log n)而DFS搜索的时间复杂度在最坏情况下是 O(2^n)但实际执行时由于剪枝操作时间复杂度会显著降低。 2. 空间复杂度 递归栈由于使用了递归我们需要考虑递归栈的深度。在最坏的情况下递归栈的深度可能达到 n即数组 candidates 的长度因为每次递归调用都可能创建一个新的递归层级。 结果存储结果列表 result 存储所有有效的组合。在最坏的情况下如果每个候选数字都可以独立地构成目标值 target那么结果列表的大小将接近 O(n)其中 n 是数组 candidates 的长度。 综合考虑总的空间复杂度可以表示为 O(n result.size)其中 n 是数组 candidates 的长度result.size 是结果列表的大小。在最坏的情况下结果列表的大小可能会非常大但是由于剪枝的存在实际的 result.size 通常会小于 2^n。 五、总结知识点 1. 数组排序使用 Arrays.sort(candidates) 对候选人数组 candidates 进行排序。这是为了确保后续搜索过程中可以利用有序性来剪枝避免重复使用相同的数字并减少搜索空间。 2. 深度优先搜索DFS通过递归的方式遍历所有可能的组合。DFS 是一种用于遍历或搜索树或图的算法它沿着一个分支深入到不能再深入为止然后回溯到上一个分支点继续搜索直到找到所需的解或遍历完所有的分支。 3. 回溯法这是一种通过递归来实现的算法策略它尝试分步解决问题。如果当前步骤不能得到有效的解它将取消上一步或几步的计算再通过其他可能的分步解决方案继续尝试。 4. 剪枝在搜索过程中通过一些条件判断来减少不必要的搜索提高算法效率。在这段代码中剪枝体现在两个地方 如果当前剩余值 remain 小于当前候选数字 candidates[i]则没有必要继续搜索因为剩余值不可能通过更大的数字来满足。如果当前候选数字与前一个候选数字相同即 candidates[i] candidates[i - 1]则跳过当前数字以避免重复的组合。 5. 动态规划思想虽然代码中没有直接使用动态规划但是其解决问题的思想与动态规划有相似之处。动态规划通常用于解决具有重叠子问题和最优子结构特性的问题而这段代码通过递归和回溯来寻找问题的最优解。 以上就是解决这个问题的详细步骤希望能够为各位提供启发和帮助。
http://www.pierceye.com/news/665766/

相关文章:

  • 大连专业企业建站找哪家wordpress 保护wp-login.php
  • 微网站建设哪家便宜想要找个网站做环评公示
  • 建设银行网银网站激活个人简历模板电子版可填写
  • 肃州区建设局网站宁夏百度seo
  • 关于做电影的网站设计西安网站建设制作 熊掌号
  • idc网站建设怎么自己做一个网页链接
  • 网站开发安全模块方案个人网站搭建软件
  • 重庆建设招标造价信息网站个人网站建设与维护
  • 网站备案用户名忘了怎么办嘉兴做外贸网站的公司
  • 1688网站的特点网站制作器手机版下载
  • 兖州网站开发做一个中英文网站多少钱
  • wordpress怎么做网盘站好看的页面图片
  • 建设网站深圳罗湖安徽合肥做网站
  • 一级a做爰片免费网站下载网站快慢由什么决定
  • 网页设计与网站建设 郑州大学网络购物网站备案
  • 美观网站建设哪家好优化大师最新版下载
  • 外贸品牌网站制作wordpress 微信主题
  • 旅游网站开发需求分析网站的根目录的路径
  • easyUI网站开发docker wordpress mysql
  • dede手机网站模板下载黄冈做网站
  • 诸城网站建设葛小燕现在搜索引擎哪个比百度好用
  • 嘉兴做微网站多少钱注册网页需要多少钱
  • 论坛类网站设计大型网站系统解决方案
  • 网站建设中页面设计广告策划书籍
  • 云南省建设工程投标中心网站网页的制作步骤是什么
  • 保定网站设计概述更换动易网站模板的方法
  • 新手如何注册网站域名做 理财网站有哪些
  • 南宁快速建站模板企业网站的开发与应用
  • 网站运营适合什么样的人做企业宣传及介绍ppt
  • 怎么样网站开源小升初在线做试卷的网站