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

南昌做网站哪家便宜武汉百度

南昌做网站哪家便宜,武汉百度,广南网站制作,美食网站页面设计模板回溯算法 回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。 基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到钱一个状态,再按照其他的…

回溯算法

回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。

基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到钱一个状态,再按照其他的规则搜索。

核心思想:“试错”,在搜索中不断地做出选择,如果选择正确,继续向前搜索,否则回退到上一个状态,重新作出选择。

1.全排列

46. 全排列 - 力扣(LeetCode)

首先我们先来了解这题的思路,它时一个排列问题就可以用上回溯地思想去解决,再结合之前经验,我们可以先全局变量来记录并保存数据。既然返回的是一个数组包含数组地问题,我们就用全局变量,一个用来记录当前的数组排列path,如果满足数组nums中地数据那就保存到另一个全局变量ret中,还有一个全局变量check负责剪枝, 如果出现重复地数据那就跳过,然后通过回溯返回上一个下标。

大致的流程就是以上所说地,现在来仔细叙述:

先创建三个全局变量ret、path、check,再将它们初始化,然后调用递归方法最后返回ret;

    public static List<List<Integer>> ret;public static List<Integer> path;public static boolean[]check;public static List<List<Integer>> permute(int[] nums) {ret = new ArrayList();path = new ArrayList();check = new boolean[nums.length];dfs(nums);return ret;}

现在主要写递归方法,如果path的大小已经满足数组nums的大小,那直接将path添加到ret中,再返回;

    if (path.size() == nums.length){ret.add(new ArrayList<>(path));return;}

通过循环来确定数组中的第一个数据,这样每一次排序都不会落下,确定完第一个那接着就是第二个,由于我们设置的全局变量check是用来记录已经存在的数据的,最开始创建check布尔类型它默认全为false,所以如果i对应的check是false说明这个位置下的数组是没有被存放进path的,所以我们就需要将i对应的下标数据存放进path中,然后再将该位置check标记为已记录(即为true),然后递归该数组直到path中已经存放的长度等于原先数组长度就返回。最后我们还需要返回现场,最后这个返回现场很重要,如果i还是小于nums.length,那就需要进行的同一层的另一个下标数据,在比较之前就需要将该位置的check置为false,且删除path中最后一个的数据方便下一个下标进行插入。

2.子集

 78. 子集 - 力扣(LeetCode)

解法一:我们可以使用上一题全排列的解法通过选和不选数组中的元素来进行解答。首先还是需要全局变量一个用来存储ret,一个用来记录path。

    public List<List<Integer>> subsets(int[] nums) {ret = new ArrayList<>();path = new ArrayList<>();dfs(nums, 0);return ret;}

     递归三步      

  • 函数头

同样需要用到递归,但是在递归的过程中我们也需要时时知道当前下该数据对应的数组下标,所以在传参时我们需要不仅需要传入数组还需要传入一个下标。dfs(int[] nums, int pos) 

  • 函数体

主要的步骤就是对数组元素的选和不选,谁先谁后不重要,假如先选只需要将数组元素添加至path中记录,然后继续往下添加,当满足返回条件时就返回,返回后我们就需要记录不选时的path,所以需要删除已经添加的最后那个元素。

  • 递归出口

当传入的数组下标等于数组的长度时,将path传入ret中记录,最后返回。

    public void dfs(int[] nums, int pos){if (pos == nums.length){ret.add(new ArrayList<>(path));return;}path.add(nums[pos]);dfs(nums, pos+1);path.remove(path.size()-1);dfs(nums, pos+1);}

解法二:我们可以从0开始,选一个的时候,选完一个再往该下标后面继续选,直到不小于数组长度就不再继续。

该方法与之前的方法差距就在于这个方法遍历的次数可以少很多,对于这个方法来说它的每一个分叉结点都是结果,解法一来说,它就只能是叶子结点,对比而言解法二更高效。

该方法需要用到循环,循环从该下标+1开始,需要添加数据到path中,最后需要回复现场。

    public void dfs(int[] nums, int pos){ret.add(new ArrayList<>(path));for (int i = pos; i < nums.length; i++){path.add(nums[i]);dfs(nums, i+1);path.remove(path.size()-1);}}

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

相关文章:

  • 企业可以做哪些网站有哪些内容吗如何写营销软文
  • 做网站学哪些语言seo网络推广技术
  • 介绍在家里做的点心的网站来宾网站seo
  • 网站建设导航图图库如何设计网站的首页
  • 江门英文网站建设最厉害的搜索引擎
  • 泰州住房和城乡建设厅网站首页软件外包公司排行
  • 张家港做网站百度竞价的优势和劣势
  • 做租号玩网站赚钱吗网站seo诊断优化方案
  • 网站服务器租赁seo排名点击器原理
  • 沈阳企业做网站网络推广收费价目表
  • wordpress安装 第二步安徽seo推广
  • 太原做网站外贸建站教程
  • 邢台做wap网站的公司淘宝如何刷关键词增加权重
  • 网站logo怎么设计手机百度官网首页
  • java做3d游戏下载网站有哪些免费申请网站
  • 网络工作室取名怎么优化自己网站的关键词
  • 遵义网站建设公司企业网站seo诊断报告
  • 合肥网站建设电话合肥百度快速排名优化
  • 西安专业得网站建设公司最近军事新闻
  • 线上投票链接制作河南网站推广优化排名
  • 做设计参考的网站百度知道推广软件
  • 毕业论文:婚纱网站的制作与实现站长之家ppt模板
  • 学校做网站难吗网址域名ip解析
  • 企业做企业网站的好处aso优化排名推广
  • php成品网站超市谷歌浏览器官网下载
  • 企业做网站一般要多少钱免费自己建网页
  • 做博客网站赚钱网页链接制作生成
  • 德州网站制作站长工具seo推广
  • 帮别人做网站 别人违法刷关键词排名seo软件
  • 洛阳建设工程信息网站免费发帖推广的平台