【问题标题】:Permutation algorithm that creates an array of all permutations创建所有排列的数组的排列算法
【发布时间】:2018-12-09 05:31:02
【问题描述】:

我正在尝试编写一种称为排列的方法。基本上,我希望它接受一个整数,然后返回从 0 到 x -1 的所有数字排列。我意识到这应该返回一个数组数组。但是,我正在努力实际实施这一点。有人可以帮助我以更好的方式思考这个问题吗?我正在用java编码这个。我意识到这可能是一个递归问题,但除此之外我不知所措。

我想过有两种方法,一种方法是接收整数并从 0 - x-1 创建第一个数组。然后是另一个接受数组和一些整数“开始”的方法。这样索引开始处的整数不会改变,但会与其他数字交换。这将在 for 循环内,因此“开始”位置将在整个数组中发生变化。我对此的唯一提示是我的 for 循环将递归调用该方法。但是,我在思考如何实际实现这一点和交换算法时遇到了麻烦。

谁能告诉我我是否正在考虑这个权利,以及他们是否有任何想法或提示可以给我?我没有代码可以分享,因为我对此的大部分想法都是白板的。

【问题讨论】:

标签: java algorithm permutation


【解决方案1】:

置换可以在典型的Backtrack算法中解决,我们必须遍历状态空间中的所有可能性。回溯是一个非常重要的算法,我的建议是你看看它(通常是递归形式)并尝试掌握它的基本思想,而不是试图用你自己的方式解决排列问题。

基本上要找到一个排列,我们必须走 n 步(设置一位就是一步),在我们为每一步选择一位之后,我们就有一个排列,所以我们有一个可能的解决方案(例如,它是 @987654321 @)。之后,我们回溯到倒数第二位,注意我们在第一个解决方案中选择了5,但我们可以有另一个选择6,之后我们只有一个选择最后一位是5。对于其他解决方案,我们继续回溯到倒数第三位、倒数第四位……等等。这就是为什么要命名回溯的原因。

您可以将回溯与 DFS 或二叉树上的遍历算法进行比较。它们在很多地方都非常相似。

下面是我对这个问题的解决方案,结果是一个arrayList,permutaion是根据1...n而不是0...n-1给出的,但是里面的想法是完全一样的。

class Solution {
public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> permutations=new ArrayList();
    backtrack(permutations,new ArrayList<Integer>(),nums);
    return permutations;
}

private void backtrack(List<List<Integer>> permutations,List<Integer> tempList,int[] nums){
    if(tempList.size()==nums.length){
        permutations.add(new ArrayList<Integer>(tempList));
        return;
    }

    for(int i=0;i<nums.length;i++){
        if(tempList.contains(nums[i])){
            continue;
        }

        tempList.add(nums[i]);    
        backtrack(permutations,tempList,nums);
        tempList.remove(tempList.size()-1);
    }

}

}

【讨论】:

    【解决方案2】:

    如果我理解正确,这就是你想要的?

    public class MyClass_3928{
    
        static List<String> listOfAllArrays = new ArrayList<>();
    
        public static void calculate(int[] list, int n) {
            if (n == 1) {
                listOfAllArrays.add(Arrays.toString(list));
            } else {
                for (int i = 0; i < n; i++) {
                    calculate(list, n - 1);
    
                    int j = (n % 2 == 0) ? i : 0;
    
                    int t = list[n - 1];
                    list[n - 1] = list[j];
                    list[j] = t;
                }
            }
    
        }
    
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
            System.out.print("How many numbers would you like to permute?");
            int numbers = Integer.valueOf(scanner.nextLine());
            int[] numbersArray = new int[numbers-1];
            System.out.println("Those numbers are");
            for (int i = 0; i < numbers-1; i++) {
                numbersArray[i] = i+1;
            }
    
            calculate(numbersArray, numbersArray.length);
    
            for (int i = 0; i < listOfAllArrays.size(); i++) {
                System.out.println(listOfAllArrays.get(i));
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多