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

番禺建网站南宁建设网站

番禺建网站,南宁建设网站,杭州做网站小程序多少钱,大数据 做网站流量统计其中标题的深搜#xff0c;回溯#xff0c;剪枝我们之前专题都已经有过学习和了解#xff0c;这里多了两个穷举和暴搜#xff0c;其实意思都差不多#xff0c;穷举就是穷尽力气将所有情况都列举出来#xff0c;暴搜就是暴力地去一个一个情况搜索#xff0c;所以就是全部…其中标题的深搜回溯剪枝我们之前专题都已经有过学习和了解这里多了两个穷举和暴搜其实意思都差不多穷举就是穷尽力气将所有情况都列举出来暴搜就是暴力地去一个一个情况搜索所以就是全部遍历的意思 而实现全部遍历之前我们需要将所有情况以树状来大致画出来这棵树就叫做决策树也就是在上学时数学的某一小节学过的决策树如下图 将123的所有排列情况列举出来 就是填空一样将不同情况画出树 那么这就涉及深搜回溯和剪枝只不过之前是二叉树现在变为了多叉树 但过程都大致差不多只要画出清晰的决策树就可以将决策转化为代码 题目一 思路 先画出决策树就是上面我们举例的决策树 其中我们需要一个全局变量二维数组ret来存储所有排列的情况也是我们要返回的结果集 然后我们还需要一个全局变量一维数组path来记录其中一次的排列情况也就做其中一条路径 然后还需要一个全局变量布尔数组来记录数字的使用情况没使用过为false使用过为true 然后我们就开始遍历但注意我们是深搜dfs不是宽搜bfs即虽然画决策树的时候是先填第一个空123但实际遍历我们是填1之后将1对应的所有情况都搜索完之后再回到2这里即dfs的搜索顺序而不是bfs 结束条件也很好想就是当path的元素个数等于数组元素个数就说明排完了那么就将该path填入结果集ret中但注意path要重新new一个出来不然传的是地址后续搜索其他排列时对path修改会连带着修改之前填入的path即所有path都指向同一个path填入之后还可以用剪枝稍微优化一下因为填就说明全部元素用到了后面的其他元素都没必要再搜索了因为结果都是不可能的 而往下遍历的时候都是for循环数组的所有元素调用布尔数组如果该元素用过就不加没用过就加然后继续往下搜索 碰到结束条件后就该回溯那么就该修改布尔数组和path将该数的布尔值修改为false再删除path的最后一个元素 最后返回ret即可 代码 class Solution {//保存所有全排列的结果集ListListInteger retnew ArrayList();//用于判断该数字是否使用过boolean[] check;//其中一个排列ListInteger pathnew ArrayList();public void dfs(int[] nums){//如果排列元素的个数等于数组元素的个数说明排完了if(path.size()nums.length){//添加该排列情况要new一个新的不然就是传地址ret.add(new ArrayList(path));//剪枝return;}//遍历数组for(int i0;inums.length;i){//如果当前元素没有使用过if(check[i]false){//添加该情况path.add(nums[i]);//标记该元素使用过check[i]true;//选择下一个元素dfs(nums);//回溯该元素修改为没使用check[i]false;//删除该元素path.remove(path.size()-1);}}}public ListListInteger permute(int[] nums) { checknew boolean[nums.length];dfs(nums);return ret;} } 题目二 思路 还是先画决策树不同的决策树画法有不同的代码但只要决策树画对代码实现了就一定是对的 求子集大概有两种决策树画法 解法1 这种决策树画法就是遍历数组每遍历一个就出现两种决策选或者不选最后叶子结点就是所有的子集 代码1 class Solution {//结果集ListListInteger ret new ArrayList();//其中一个子集ListInteger path new ArrayList();//k表示到数组的哪一个元素了public void dfs(int[] nums, int k) {//如果遍历完数组了if(knums.length){ret.add(new ArrayList(path));return;}//选path.add(nums[k]);dfs(nums,k1);//恢复现场path.remove(path.size()-1);//不选dfs(nums,k1);}public ListListInteger subsets(int[] nums) {dfs(nums, 0);return ret;} } 解法2 这种决策树的画法就是以子集中的元素个数来进行决策一开始为0个也就是空集然后为1个就是123再然后为2个……其中是否选择以当前元素的位置为标准比如1就找后面的23而2就找后面的3而3就没得找了这样子就能避免出现重复的情况 则每一个结点都是一个结果所以每次dfs的时候都要添加 代码2 class Solution {//结果集ListListInteger ret new ArrayList();//其中一个子集ListInteger path new ArrayList();//k表示到数组的哪一个元素了public void dfs(int[] nums, int k) {//先添加ret.add(new ArrayListInteger(path));//从当前元素开始往后遍历for (int i k; i nums.length; i) {//添加该元素path.add(nums[i]);//再次基础上往后遍历dfs(nums, i 1);//恢复现场path.remove(path.size() - 1);}}public ListListInteger subsets(int[] nums) {dfs(nums, 0);return ret;} } 但综合来看肯定是解法2更优因为每一个结点都是结果没有多余的浪费而解法1则全部枚举了出来但最后只选择了叶子结点非叶子结点就多余了 总结 解决全排列集合这种需要枚举许多情况并回溯的先画出决策树决策树不唯一只要思路是对的通过代码来实现其中需要注意回溯后要恢复现场最后就是正确的
http://www.tj-hxxt.cn/news/136166.html

相关文章:

  • 深圳物流公司网站公司网站备案需要哪些资料
  • WordPress网站修改做基因表达热图的网站
  • 网站建设科技公司外部环境分析创新型的顺的网站制作
  • 国内做轮胎网站哪家好怎么安装百度
  • 重庆网站建设搜外杭州公司注册费用
  • 做五金奖牌进什么网站湛江赤坎孵化器网站建设招聘
  • 网站建设自己建设工程合同在性质上属于什么合同
  • 手机搞笑网站模板下载安装中国建筑人事部大全
  • 在线考试网站模板网站seo方案
  • 做设计的地图网站有哪些十大景观设计公司排名
  • 网站设计不需要考虑怎样做淘宝联盟网站
  • 外贸网站建设入门建设食品网站
  • 哪个小说网站版权做的好处wordpress插件video playe
  • 南通免费网站建设织梦大气婚纱影楼网站源码
  • 怎么才能把网站优化做好服装设计个人工作室
  • 织梦做网站主页容易吗娱乐城网站开发
  • 优秀企业网站建设哪家服务好网站建设社团活动宗旨
  • 大悟建设局网站怎么以公司名义注册邮箱
  • 个人网站怎么做支付微信上wordpress
  • 软件网站建设基本流程图网站建设毕业设计报告书
  • 梯子seo网络优化师招聘
  • 网站后台英语财务软件哪个好用
  • 网站推广公司汉狮网络江干区网站建设
  • 北京网站推广优化上海网站建设推荐案例
  • 网站搜索推广方案论文上海网站备案审核
  • 哪种类型的网站比较难做制作英文网站多少钱
  • 360永久免费建网站专业柳州网站建设多少钱
  • 济南外贸网站中国建设app官方下载
  • 免费网站模板怎么做网站做的网站怎么上传到网上
  • 中国手机最好的网站排名电商系统app开发