交换ArrayList java的元素
我发现这段代码用于交换,但我需要消除递归?是否可以使用ArrayList而不是数组交换ArrayList java的元素,java,Java,我发现这段代码用于交换,但我需要消除递归?是否可以使用ArrayList而不是数组 public class A { static ArrayList<int[]> permutations(int[] a) { ArrayList<int[]> ret = new ArrayList<int[]>(); permutation(a, 0, ret); return ret; } pu
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;
}
公共A类{
静态数组列表置换(int[]a){
ArrayList ret=新的ArrayList();
置换(a,0,ret);
返回ret;
}
公共静态无效置换(int[]a,int pos,ArrayList列表){
如果(a.长度-位置==1)
list.add(a.clone());
其他的
对于(int i=pos;i
如果您的问题是,您可以使用数组列表交换两个元素,那么答案是肯定的:
Collections.swap(arr, pos1, pos2);
下面是一个快速而肮脏的非递归解决方案,用于查找整数数组的所有排列:
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;
}
公共静态列表置换(int[]a){
列表=新的ArrayList();
int l=a.长度;
int permNumber=0;
while(true){
比特集usedIndices=新比特集();
int[]newPermutation=newint[l];
int rest=permNumber;
对于(int i=0;i=0){
做{
freeIdx++;
}while(usedices.get(freeIdx));
库里克斯--;
}
使用dices.set(freeIdx);
新置换[i]=a[freeIdx];
}
如果(剩余>0)
打破
列表。添加(新排列);
permNumber++;
}
退货清单;
}
这段代码只是根据其序号生成一个排列。请注意,排列的数量会迅速增长(作为数组长度的阶乘),因此即使在不太大的数组上,您也可以从MemoryError中获得。您能具体说明您的问题吗?交换什么?在交换中,我没有看到任何递归。