首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归地返回给定列表的所有排列。

递归地返回给定列表的所有排列。
EN

Stack Overflow用户
提问于 2021-07-09 00:11:51
回答 1查看 336关注 0票数 1

下面的算法打印给定列表arr的所有排列

代码语言:javascript
复制
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);
    }
}

(FYI:该算法取自this答案)

我想修改该算法,以便它返回所有解决方案的列表,而不是打印它们,例如:

代码语言:javascript
复制
static List<List<Integer>> permute(java.util.List<Integer> arr, int k);

我该怎么做?我尝试了对算法进行以下修改,但没有奏效:

代码语言:javascript
复制
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]]的错误结果。我很难理解为什么代码不能工作,以及如何正确地执行它。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2021-07-09 20:13:18

如前所述,您需要添加配置列表的副本。

此外,不需要创建一个新列表来保存递归的每个级别上的排列。您可以创建一个列表来保存结果并将其作为参数传递:

代码语言:javascript
复制
static void permute(List<List<Integer>> res, List<Integer> arr, int k) {
  if (k == arr.size() - 1) {
    res.add(new ArrayList<>(arr));
    return;
  }

  for (int i = k; i < arr.size(); i++) {
    Collections.swap(arr, i, k);
    permute(res, arr, k + 1);
    Collections.swap(arr, k, i);
  }
}

public static void main(String[] args) {
  List<List<Integer>> res = new ArrayList<>();
  permute(res, Arrays.asList(1, 2, 3), 0);
  System.out.println(res);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68309862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档