博客
关于我
leetcode题解46-全排列
阅读量:797 次
发布时间:2023-01-31

本文共 1738 字,大约阅读时间需要 5 分钟。

解决这个问题的方法是使用深度优先搜索(DFS)回溯法,每次递归选择下一个元素,并尽量深入,直到所有位置都填满,这样得到一个完整的全排列。

逐个工作流程:

  • 初始化变量

    • 保存所有结果的集合(例如List)。
    • 标记数组(visited),记录每个元素是否已被使用。
    • 数组(digits),保存当前的排列。
  • DFS递归函数

    • 当已选位置(k)等于数组长度时,将当前排列添加到结果中。
    • 否则,遍历数组中的每个元素:
      • 如果未被访问过,选择该元素,更新digits并访问标记。
      • 进行递归到下一个位置(k+1)。
      • 递归返回后,撤销当前选择,删除digits的最后一个元素并取消标记。
  • 主函数

    • 初始化变量。
    • 调用DFS函数,从位置0开始。
  • 这样的方法确保所有可能的排列都会生成,且每个排列都是唯一的。

    以下是示例代码:

    import java.util.ArrayList;import java.util.List;public class Solution {    List
    > lists = new ArrayList<>(); int len; int[] digits = new int[len]; boolean[] visited = new boolean[len]; public List
    > permute(int[] nums) { len = nums.length; digits = new int[len]; visited = new boolean[len]; lists = new ArrayList<>(); dfs(nums, 0); return lists; } void dfs(int[] nums, int k) { if (k == len) { //生成一个完整的排列 List
    list = new ArrayList<>(); for (int i : digits) { list.add(i); } lists.add(list); return; } else { for (int i = 0; i < nums.length; i++) { if (!visited[i]) { digits[k] = nums[i]; visited[i] = true; dfs(nums, k + 1); //撤销选择,恢复现场 digits[k] = 0; visited[i] = false; } } } } public static void main(String[] args) { int[] nums = {1, 2, 3}; System.out.println(new Solution().permute(nums)); }}

    代码解释

    • permute方法初始化变量,调用DFS方法,从位置0开始。
    • dfs方法递归地选择每个元素。如果k等于数组长度,生成排列并保存。否则,逐个尝试未被使用的元素,进行递归,回溯后恢复现场。
    • visited数组确保每个元素只被使用一次,防止重复计算。

    这个方法确保了所有可能的全排列都被生成,且高效地进行回溯,保证性能。

    转载地址:http://negyk.baihongyu.com/

    你可能感兴趣的文章
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>