【问题标题】:Java: Permutation of arrayJava:数组的排列
【发布时间】:2013-08-26 06:04:03
【问题描述】:

我对 Java 中的递归不是很熟悉。我正在尝试编写一种方法来计算整数数组的所有排列。我需要修改以下完美的工作方法,以便将它们插入到二维数组中,而不是打印以筛选数组的所有排列。因此该方法的输入是 n 个整数数组,输出是一个具有 n! 行和 n 列的二维数组。我需要修改的程序是这样的:

public static void permute(int[] array, int k)
{
    for(int i=k; i<array.length; i++)
    {
        int temp;
        temp = array[i];
        array[i] = array[k];
        array[k] = temp;
        permute(array, k+1);
        int temp2;
        temp2 = array[i];
        array[i] = array[k];
        array[k] = temp2;
    }
    if (k == array.length-1)
    {
        Array.printValues(array);
    }
}

所以,我需要的是这样的:

public static int[][] permute(int[] array, int k)
{
    //code here
}

谢谢。

【问题讨论】:

  • 如果你的原始数组的元素个数大于12,你的输出数组的行数会溢出最大整数范围,你明白吗?

标签: java arrays recursion permutation


【解决方案1】:

将它们放在一个列表中,然后从中取出一个数组。您可以直接使用 int[][],但如果不进行额外重复,您不知道第一个维度值。

public static int[][] permuteToArray(int[] array, int k){
    ArrayList<int[]> arrL=new ArrayList<>();
    for(int i=k; i<array.length; i++)
    {
        int temp;
        temp = array[i];
        array[i] = array[k];
        array[k] = temp;
        permute(array, k+1, arrL);
        int temp2;
        temp2 = array[i];
        array[i] = array[k];
        array[k] = temp2;
    }
    if (k == array.length-1)
    {
        arrL.add(array);
    }
    return arrL.toArray(new int[][]);
}

permute( 更改为:

public static void permute(int[] array, int k, ArrayList arrL) //raw type, I know
{
    for(int i=k; i<array.length; i++)
    {
        int temp;
        temp = array[i];
        array[i] = array[k];
        array[k] = temp;
        permute(array, k+1);
        int temp2;
        temp2 = array[i];
        array[i] = array[k];
        array[k] = temp2;
    }
    if (k == array.length-1)
    {
        arrL.add(array);
    }
}

【讨论】:

    【解决方案2】:
    public static void _permute(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> cur, int k, boolean[] status, int[] array)
    {
      if (cur.size() == k) {
        res.add((ArrayList<Integer>)cur.clone());
        return;
      }
      for (int i = 0; i < k; i++)
      {
        if (status[i]) continue;
        cur.add(array[i]);
        status[i] = true;
        _permute(res, cur, k, status, array);
        status[i] = false;
        cur.remove(new Integer(array[i]));
      }
    }
    
    public static ArrayList<ArrayList<Integer>> permute(int[] array, int k)
    {
      ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
      ArrayList<Integer> cur = new ArrayList<Integer>();
      boolean[] status = new boolean[k];
      for (int i = 0; i < k; i++) 
      {
        status[i] = false;
      } 
      _permute(res, cur, k, status, array);
      return res;
      //code here
     }
    

    您可以获得数组列表中数组的所有排列。我认为您可以自己从列表中提取数组。请注意,如果原始数组中有相同的数字,此函数可以删除重复。

    【讨论】:

      【解决方案3】:
       public static void swap(int[] array, int i, int j) {
          int temp = array[i];
          array[i] = array[j];
          array[j] = temp;
      }
      
      public static void permute(int[] array, List<int[]> cache, int k)
      {
      
          if (k == array.length-1)
          {
              cache.add(array.clone()); //use clone, or you will get the same int array
              return;
          }
          for(int i=k; i<array.length; i++)
          {
              swap(array, i,k);
              permute(array, cache, k+1);
              swap(array, i, k);
          }
      }
      

      【讨论】:

        【解决方案4】:

        我可以给你一个递归置换算法的例子。 它基于n个元素的排列是基于n-1个元素的排列这一事实。

        import java.util.ArrayList;
        import java.util.List;
        
        class Permutation {
        
            public static void main(String[] args) {
                List<Object> input = new ArrayList<>();
                input.add(1);
                input.add(2);
                input.add(3);
                print(permutation(input));
            }
        
            public static void print(List<List<Object>> list) {
                for (List<Object> objects : list) {
                    System.out.println(objects);
                }
            }
        
            public static List<List<Object>> permutation(List<Object> input) {
                if (input.isEmpty()) {
                    throw new IllegalStateException();
                }
                // This is end condition for recursion
                if (input.size() == 1) {
                    List<List<Object>> result = new ArrayList<>();
                    result.add(input);
                    return result;
                }
                return merge(input.get(0), permutation(input.subList(1, input.size())));
            }
        
            private static List<List<Object>> merge(Object o, List<List<Object>> input) {
                List<List<Object>> result = new ArrayList<>();
                int inputSize = input.get(0).size();
                for (int i = 0; i < inputSize + 1; i++) {
                    for (List<Object> oneRow : input) {
                        // copy the row and insert additional element
                        List<Object> oneRowExpanded = new ArrayList<>();
                        oneRowExpanded.addAll(oneRow);
                        oneRowExpanded.add(i, o);
                        result.add(oneRowExpanded);
                    }
                }
                return result;
            }
        }
        

        这将打印以下内容:

        [1, 2, 3]
        [1, 3, 2]
        [2, 1, 3]
        [3, 1, 2]
        [2, 3, 1]
        [3, 2, 1]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-20
          相关资源
          最近更新 更多