博客
关于我
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/

    你可能感兴趣的文章
    node, nvm, npm,pnpm,以前简单的前端环境为什么越来越复杂
    查看>>
    Node-RED中Button按钮组件和TextInput文字输入组件的使用
    查看>>
    vue3+Ts 项目打包时报错 ‘reactive‘is declared but its value is never read.及解决方法
    查看>>
    Node-RED中Slider滑杆和Numeric数值输入组件的使用
    查看>>
    Node-RED中Switch开关和Dropdown选择组件的使用
    查看>>
    Node-RED中使用exec节点实现调用外部exe程序
    查看>>