2015-05-05 144 views
0

我發現這個代碼交換,但我需要消除遞歸?是否有可能使用ArrayList而不是Array?交換ArrayList的元素-java

public class A { 

    static ArrayList<int[]> permutations(int[] a) { 
     ArrayList<int[]> ret = new ArrayList<int[]>(); 
     permutation(a, 0, ret); 
     return ret; 
    } 

    public static void permutation(int[] a, int pos, ArrayList<int[]> list) { 
     if (a.length - pos == 1) 
      list.add(a.clone()); 

     else 
      for (int i = pos; i < a.length; i++) { 
       swap(a, pos, i); 
       permutation(a, pos + 1, list); 
       swap(a, pos, i); 
      } 
    } 

    public static void swap(int[] arr, int pos1, int pos2) { 
     int h = arr[pos1]; 
     arr[pos1] = arr[pos2]; 
     arr[pos2] = h; 
    } 
+1

你能詳細說明你的問題嗎?交換什麼?而在交換中,我沒有看到任何遞歸。 –

回答

0

如果你的問題是根本就只需更換使用ArrayList兩個元素,那麼答案是肯定的:

Collections.swap(arr, pos1, pos2); 
0

這裏的快速和骯髒的非遞歸解決方案找到整數的所有排列array:

public static List<int[]> permutation(int[] a) { 
    List<int[]> list = new ArrayList<>(); 
    int l = a.length; 
    int permNumber = 0; 
    while(true) { 
     BitSet usedIndices = new BitSet(); 
     int[] newPermutation = new int[l]; 
     int rest = permNumber; 
     for(int i=0; i<l; i++) { 
      int curIdx = rest % (l-i); 
      rest /= (l-i); 
      int freeIdx = -1; 
      while(curIdx >= 0) { 
       do { 
        freeIdx++; 
       } while(usedIndices.get(freeIdx)); 
       curIdx--; 
      } 
      usedIndices.set(freeIdx); 
      newPermutation[i] = a[freeIdx]; 
     } 
     if(rest > 0) 
      break; 
     list.add(newPermutation); 
     permNumber++; 
    } 
    return list; 
} 

此代碼僅基於其序數生成排列。請注意,排列數快速增長(因爲數組長度的因子),所以即使在不是很大的數組上,也可以獲得OutOfMemoryError