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

网站免费推广100种方法中信建设有限责任公司国内区事业部招聘

网站免费推广100种方法,中信建设有限责任公司国内区事业部招聘,公司网站建设框架,网站建设调查的问卷在学习和使用回溯算法解决问题时&#xff0c;我们经常会遇到需要维护一个结果列表&#xff0c;例如所有可能的子集、组合或排列。 这个结果列表通常是一个 List<List<Integer>>&#xff0c;其中内部的 List<Integer> 代表一个具体的解。 然而&#xff0c;在…

在学习和使用回溯算法解决问题时,我们经常会遇到需要维护一个结果列表,例如所有可能的子集、组合或排列。 这个结果列表通常是一个 List<List<Integer>>,其中内部的 List<Integer> 代表一个具体的解。

然而,在构建这些内部的 List<Integer> 时,我们应该使用 List 接口还是 ArrayList 类呢? 这个问题看似简单,但背后隐藏着一个关于深拷贝和浅拷贝的重要概念,它直接影响到回溯算法的正确性。

问题重现:回溯算法中的陷阱

让我们考虑一个简单的例子:使用回溯算法找到一个数组的所有子集。 一个常见的实现方式如下:

import java.util.ArrayList;
import java.util.List;public class Subsets {public static List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();backtrack(nums, 0, new ArrayList<>(), res);return res;}private static void backtrack(int[] nums, int index, List<Integer> currentSubset, List<List<Integer>> res) {// 基本情况:将当前子集添加到结果列表res.add(currentSubset); // 潜在的问题!// 递归探索for (int i = index; i < nums.length; i++) {currentSubset.add(nums[i]); // 选择backtrack(nums, i + 1, currentSubset, res);currentSubset.remove(currentSubset.size() - 1); // 撤销选择 (回溯)}}public static void main(String[] args) {int[] nums = {1, 2, 3};List<List<Integer>> allSubsets = subsets(nums);System.out.println(allSubsets);}
}

展开

这段代码看起来很合理,但如果你运行它,你会发现结果是错误的! 例如,对于输入 [1, 2, 3],你可能会得到类似 [[], [], [], [], [], [], [], []] 的结果,而不是预期的 [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]

问题出在哪里?

问题在于这行代码:

res.add(currentSubset);

这里,我们直接将 currentSubset 添加到 res 中,而没有进行任何拷贝。 这意味着 res 中的所有元素都指向同一个 currentSubset 对象。 当我们在回溯过程中修改 currentSubset 时,res 中的所有元素都会受到影响,最终导致错误的结果。

深拷贝的必要性

为了解决这个问题,我们需要对 currentSubset 进行深拷贝,然后再将其添加到 res 中。 深拷贝会创建一个新的 ArrayList 对象,并将 currentSubset 中的所有元素复制到这个新的 ArrayList 中。 这样,res 中的每个元素都将指向一个独立的列表,而对 currentSubset 的修改不会影响到 res 中的其他元素。

正确的代码如下:

import java.util.ArrayList;
import java.util.List;public class Subsets {public static List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<>();backtrack(nums, 0, new ArrayList<>(), res);return res;}private static void backtrack(int[] nums, int index, List<Integer> currentSubset, List<List<Integer>> res) {// 基本情况:将当前子集添加到结果列表res.add(new ArrayList<>(currentSubset)); // 深拷贝!// 递归探索for (int i = index; i < nums.length; i++) {currentSubset.add(nums[i]); // 选择backtrack(nums, i + 1, currentSubset, res);currentSubset.remove(currentSubset.size() - 1); // 撤销选择 (回溯)}}public static void main(String[] args) {int[] nums = {1, 2, 3};List<List<Integer>> allSubsets = subsets(nums);System.out.println(allSubsets);}
}

展开

现在,res.add(new ArrayList<>(currentSubset)) 创建了一个 currentSubset 的副本,并将这个副本添加到 res 中。 这样,res 中的每个元素都指向一个独立的列表,结果就是正确的。

http://www.dtcms.com/a/445347.html

相关文章:

  • 大石网站建设济南网站建设找老兵
  • 专门做建筑设计图库的网站设计专业seo网站优化推广排名教程
  • 做爰片姿势网站东营垦利
  • 大学网站建设图阿里云做网站经费
  • 赣州做网站建设成都市住房和建设局官网
  • htmi如何做网站ppt资源网免费
  • 那里有专业注册网站建设的做外贸网站应该关注哪些地方
  • 桂林市建设工程质量监督站网站400建筑网官网
  • 动感网站模板wordpress 登录接口
  • 华大基因 网站建设公司免费入驻的卖货平台有哪些
  • 怎么知道网站谁建的北京编程培训机构哪个好
  • 天津网站建设网站排名优化手游推广平台有哪些
  • 网站建设哪里专业汕头网页网站制作
  • 荣誉章标志做网站如何在小程序开店铺
  • 如何做一家网站ps网站首页设计图
  • 三合一网站指的是什么设计资源网
  • 外贸建站代理简述电子商务网站建设的基本要求
  • 建设网站的内容给公司做网站需要什么信息
  • 个人网站做推广小程序app开发制作
  • 怎么把淘宝店放到自己做的网站去中国工商黄页
  • 上海高端网站建设服务公司乐清问政网络平台
  • 做网站麻烦么Wordpress怎么配合HTML
  • html5手机网站整套模板聚美优品网站建设的目标
  • 中国建设银行企业网站首页自动化 东莞网站建设
  • 网站建设培训会讲话天津手工活外发加工网
  • 东莞热点网站建设江苏省建设工程交易中心网站
  • 九天智能建站软件最新版wordpress
  • 广告网站建设与制作网站内链 工具
  • 东莞的网站建设公司wordpress模板能修改吗
  • 网站开发工程师薪酬待遇地域购物网站