全排列
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 18 ms, 内存: 16.2 MB
/*
题目思路:
使用 Java Stream API 实现全排列问题。虽然使用 Stream 进行递归和回溯不太直观,但可以通过递归函数配合 flatMap 来实现。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SolutionStream {
public List<List<Integer>> permute(int[] nums) {
return permuteHelper(nums, new boolean[nums.length]);
}
private List<List<Integer>> permuteHelper(int[] nums, boolean[] used) {
List<List<Integer>> results = new ArrayList<>();
if (IntStream.of(used).allMatch(b -> b)) {
results.add(new ArrayList<>());
} else {
for (int i = 0; i < nums.length; i++) {
if (!used[i]) {
used[i] = true;
List<List<Integer>> perms = permuteHelper(nums, used);
used[i] = false;
for (List<Integer> perm : perms) {
List<Integer> newPerm = new ArrayList<>();
newPerm.add(nums[i]);
newPerm.addAll(perm);
results.add(newPerm);
}
}
}
}
return results;
}
}
解释
方法:
此题解采用了深度优先搜索(DFS)的方法来生成数组的所有可能全排列。递归函数 dfs 被用来尝试所有可能的元素组合。当递归的当前列表长度与输入数组长度相同时,说明形成了一个完整的排列,该排列被添加到结果列表中。在递归中,对输入数组中的每个元素进行遍历,如果元素已经存在于当前排列中,则跳过以避免重复使用;否则,将该元素添加到当前排列中,并继续递归。递归返回后,需要将最后添加的元素移除(回溯),以便尝试其他可能的元素添加。
时间复杂度:
O(n * n!)
空间复杂度:
O(n)
代码细节讲解
🦆
在DFS递归中,你是如何处理可能的重复元素,以确保每个元素只出现一次?
▷🦆
递归函数中,为什么要使用cur.pop()进行回溯,这个操作的具体目的是什么?
▷🦆
您如何保证在dfs函数中,res列表的全排列是按照题目要求的任意顺序返回的?
▷