本文共 1738 字,大约阅读时间需要 5 分钟。
解决这个问题的方法是使用深度优先搜索(DFS)回溯法,每次递归选择下一个元素,并尽量深入,直到所有位置都填满,这样得到一个完整的全排列。
逐个工作流程:
初始化变量:
DFS递归函数:
主函数:
这样的方法确保所有可能的排列都会生成,且每个排列都是唯一的。
以下是示例代码:
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)); }}
代码解释:
这个方法确保了所有可能的全排列都被生成,且高效地进行回溯,保证性能。
转载地址:http://negyk.baihongyu.com/