热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据结构与算法:回溯法之全排列

题源:46.全排列初次接触回溯法真的好难,debug了半天才了解到了其中的具体原理过程,接下来我引用weiwei哥的讲解和我自己的一些理解,

题源:
46.全排列
初次接触回溯法真的好难,debug了半天才了解到了其中的具体原理过程,接下来我引用weiwei哥的讲解和我自己的一些理解,希望可以为读者讲明白其中的原理。
什么是回溯法?
简单来说,就是分步地去解决问题,当发现某一步不符合我们的条件时就跳回到上一个步骤,再次尝试其它的路径寻求当前问题的解决方案。类似于dfs(深度优先搜索)
回溯法的具体步骤
1.choose:选择当前"迷宫"的一条路径
2.explore:判断当前路径是否满足条件
3.un-choose:如果成功就做个已经访问过的标记,反之则退回到上一步
本质是递归+某些限制条件(暴力搜索+剪枝)
如何实现
遍历所给数组,采用空间换时间的方法定义一个visited数组表示当前数是否被遍历,false时加入curList中,递归调用dfs方法。un-choose阶段中再回溯,把当前值去掉
代码具体实现

package com.algorithm.recall;import java.util.ArrayList;
import java.util.List;/*** @program: Java IDEA Projects* @create: 2022-01-24 20:40**/
public class permute {public List<List<Integer>> permute(int[] nums) {//定义一个动态数组结果集List<List<Integer>> res&#61;new ArrayList<>();//进行一个简单的判断if(nums.length<1) return res;//定义存储当前结果集合的listList<Integer> curList&#61;new ArrayList<>();//定义visited数组标记当前数是否被访问boolean[] visited&#61;new boolean[nums.length];//递归调用dfsdfs(nums,curList,visited,res);return res;}/**** &#64;Param: [nums:输入数组,* path:存储当前结果的数组,* visited:当前数是否已经被访问,* res:结果集]* &#64;return: void* &#64;Date: 2022/1/25*/private void dfs(int[] nums, List<Integer> curList, boolean[] visited,List<List<Integer>> res) {//满足条件时加入结果集if(curList.size() &#61;&#61; nums.length) {res.add(new ArrayList<>(curList));return;}for(int i&#61;0;i<nums.length;i&#43;&#43;) {//如果当前数已经被标记访问过,那么就跳过if(visited[i]) continue;//未被标记就加入当前结果集,并标记这个数已被访问curList.add(nums[i]);visited[i]&#61;true;//递归调用dfs(nums, curList, visited, res);//满足条件时回溯,即un-choose阶段//将最后一个数返回相当于回到上一个步骤//将上一个步骤的数设为false,选择其它的路径curList.remove(curList.size()-1);visited[i]&#61;false;}}}

dubug具体实现过程,以nums&#61;[1,2,3]为例
i&#61;0时,即numso[i]&#61;1;
在这里插入图片描述
i&#61;1时,即nums[i]&#61;2;
在这里插入图片描述
i&#61;2时满足条件加入到结果集中
在这里插入图片描述

递归返回到上一个循环中执行dfs下面的语句&#xff0c;即将3这个数从当前结果集中移除&#xff0c;并将3对应的下标i&#61;2设为false。注意此时的i是在循环里的&#xff0c;执行完之后i不满足循环的条件跳出了循环。此时再次返回递归的上一个条件…以此循环
在这里插入图片描述
在这里插入图片描述


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
寒时凝结公寓_264
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有