java - 递归返回给定列表的所有排列
问题描述
以下算法打印给定列表的所有排列arr
:
public class Permute {
static void permute(java.util.List<Integer> arr, int k) {
for (int i = k; i < arr.size(); i++) {
java.util.Collections.swap(arr, i, k);
permute(arr, k + 1);
java.util.Collections.swap(arr, k, i);
}
if (k == arr.size() - 1) {
System.out.println(java.util.Arrays.toString(arr.toArray()));
}
}
public static void main(String[] args) {
Permute.permute(java.util.Arrays.asList(1, 2, 3), 0);
}
}
(仅供参考:算法取自这个答案)
我想修改算法,使其返回所有解决方案的列表,而不是打印它们,例如:
static List<List<Integer>> permute(java.util.List<Integer> arr, int k);
我该怎么做?我尝试了以下算法的修改,但没有奏效:
public class Permute {
static List<List<Integer>> permute(java.util.List<Integer> arr, int k) {
List<List<Integer>> arrs = new ArrayList<>();
for (int i = k; i < arr.size(); i++) {
java.util.Collections.swap(arr, i, k);
arrs.addAll(permute(arr, k + 1));
java.util.Collections.swap(arr, k, i);
}
if (k == arr.size() - 1) {
arrs.add(arr);
System.out.println(java.util.Arrays.toString(arr.toArray()));
}
return arrs;
}
public static void main(String[] args) {
List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 3));
System.out.println(Permute.permute(arr, 0));
}
}
代码编译并执行,但给出了错误的结果[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
。我无法理解为什么代码不起作用以及如何正确执行。任何帮助表示赞赏。
解决方案
您需要将 的副本添加List
到结果中,而不是每次都添加相同的副本。
改变
arrs.add(arr);
至
arrs.add(new ArrayList<>(arr));
完整方法:
static List<List<Integer>> permute(java.util.List<Integer> arr, int k) {
List<List<Integer>> arrs = new ArrayList<>();
for (int i = k; i < arr.size(); i++) {
java.util.Collections.swap(arr, i, k);
arrs.addAll(permute(arr, k + 1));
java.util.Collections.swap(arr, k, i);
}
if (k == arr.size() - 1) {
arrs.add(new ArrayList<>(arr));
}
return arrs;
}
推荐阅读
- ios - 有时会错过 iBeacon 的 didExitRegion 事件
- javascript - 在函数内获取值以在函数外使用
- python - 如何通过 pyspark 从 cassandra 获取数据?
- typo3 - 如何从 url 中排除详细信息页面的路径段?
- sql-server - SQL SERVER:选择跟随某些字符的数字
- asp.net-mvc - 如何获取我使用实体框架的 html 文件中的值
- php - 如何在 PHP 中以不同格式对特定数字进行 preg_grep?
- google-pagespeed - 资源正在阻止您页面的第一次绘制。考虑交付关键的 JS/CSS 内联并推迟所有非关键的 JS/样式
- php - 如何在 Windows 中将 Laravel 应用程序连接到 MySQL 而无需密码
- c++ - 如何修复命名空间“std”在 VSCode 中没有成员“sqrt”?